반응형
문제를 푸시기 전에 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
반응형
'[ ★ ]Study > War Game' 카테고리의 다른 글
[Toddler's Bottle] pwnable.kr input 풀이 (0) | 2017.09.13 |
---|---|
[Toddler's Bottle] pwnable.kr random 풀이 (0) | 2017.08.17 |
[Toddler's Bottle] pwnable.kr flag (0) | 2017.08.17 |
[Toddler's Bottle] pwnable.kr bof (0) | 2017.08.16 |
[Toddler's Bottle] pwnable.kr collision (0) | 2017.08.16 |
댓글