본문 바로가기
[ ★ ]Study/War Game

[Toddler's Bottle] pwnable.kr passcode 풀이

by nroses-taek 2017. 8. 17.
문제를 푸시기 전에 PLT, GOT 공부해 봅시다.
제가 제일 만족하면서 봤던 블랙펄 사이트이구요.
링크만 봐서는 부족하고, 따로 구글에서 찾아보면서 공부하시길 바랍니다.



보기엔 단순한 코드입니다. 과연 컴파일 어떤 경고가 나타났던 것일까요?
뭐… 소스코드를 잘보셨다면, passcode 입력 받는 부분에 & 연산자가 없습니다.
이는 변수 주소에 입력값을 넣는 행위이죠. 출력하면 쓰레기 값이 나올 겁니다.

실제로 환경에서는 쓰레기 음수가 출력되고, pwnable.kr 환경에서는 쓰레기 양수 값이 나오네요. 
사진은 첨부하지 않겠습니다.

login 함수 입니다.

ebp-0x10 = passcode 1
ebp-0xc = passcode 2 라는 것을 알 수 있습니다.

welcome 함수를 봅시다.

기본적인 분석을 해보면…
사진에 +38 부분부터는 이름을 입력받습니다.
lea edx, ebp-0x70이라고 되어 있는데, 부분부터 char name[100]만큼 할당을 받겠죠?
0x70 - 0x64 = 0xc 입니다. 하지만… login 부분에서 0x10 passcode1 자리죠? 겹치게 되는 상황이 발생하였습니다.
즉, 이름 4바이트는 passcode1 값을 맘대로 넣을 있습니다.

<exit 함수의 plt 주소 찾기 >
다시 저희가 봐야될 곳이 이 부분인데, passcode1 에다가 exit의 plt값을 넣었습니다.
아래의 사진은 exit의 plt를 알아내기 위한 과정입니다.

그리고 그 exit 함수의 인자값을 system(/bin/cat flag); 실행하도록 했습니다.

login 함수 부분의 system 함수와 system 함수의 인자부분
즉, 그 시작지점인 0x080458e3을 exit의 인자로 넣어줍니다.
(login 함수 어셈보시면 +127 위치입니다)

**** 제일 중요한건 현재 여기까지 오셨으면 ****
scanf("%d", passcode1); 부분이고, 저희가 조작하였으니,
scanf("%d", exit@plt); 되었습니다.
exit함수가 실행 되면서 괄호안에 있는 인자값(0x080485e3 system(/bin/cat flag);) 실행이 되겠지요?
하지만 %d 라는 때문에, 0x080485e3부분을 10진수로 바꿔서 넣어주어야 합니다.
 
(python -c 'print"D"*96 + "\x18\xa0\x04\x08" + "134514147"';cat) | ./passcode



댓글