제일 먼저 extern char **environ이 눈에 띕니다.
extern은 현재 소스파일에 존재하지 않고 다른 소스파일에 존재하는 변수를 끌어다 쓸 때 사용합니다.
environ은 프로그램의 환경변수 입니다.
해당 문제에서의 egghunter 목표는 eggshell의 무력화입니다.
(해당 풀이에서는 eggshell을 사용하지 않습니다.)
egghunter 이후에 나오는 코드를 보니 argv[1]의 48번째 값은 0xbf로 설정되어야만 다음으로 넘어갑니다.
argv[1]의 48번째 값만 맞춰주고 이후는 2번 문제와 동일합니다.
Stack 구조
Low addr
buffer (40-byte) |
sfp (4-byte)
|
ret (\x00\x00\x00\xbf) |
shell
|
High addr
Little endian을 모르시면 다음 글을 읽고 오세요.
-> http://slimv.tistory.com/entry/Little-endian
shell code가 올라가는 주소를 찾기 위해 임시로 컴파일한 파일을 gdb로 열어봅니다.
strcpy 함수 위에 있는 main+184에 Break point를 걸고 edx를 확인해 보겠습니다.
실행할 때 ret 주소값이 0xbf로 시작하게 반드시 맞춰줘야 합니다.
shell code가 들어갈 주소는 0xbffffbea 입니다.
nop slide를 채우고 뒤에 shell code를 올린 뒤 slide 중간쯤에 return 해주면 됩니다.
공격에 성공했습니다.