4번 문제와 비슷한데 egghunter가 없어지고
argv[1]의 47번째 값이 0xff인 경우 에러 메시지를 출력하고 종료합니다.
argv 개수 제한이 없으므로 argv[2]에 shellcode를 넣도록 하겠습니다.
Stack 구조
Low addr
buffer (40-byte) |
sfp (4-byte)
|
ret (\x00\x00\x00\xbf) |
shell
|
High addr
shell code가 올라가는 주소를 찾기 위해 임시로 컴파일한 파일을 gdb로 열어봅니다.
argv[2]는 argv[1] 바로 뒤에 있기 때문에 argv[1]에 접근하는 strcpy에 Break point를 걸고 stack을 봅니다.
main+127에 Break point를 걸고 stack을 확인해 보겠습니다.
실행할 때 ret 주소값이 0xbf로 시작하게 맞춰줘야 합니다.
argv[2]가 시작되는 주소는 0xbffffbf1 입니다.
ret에 저장된 주소는 맨 앞은 0xbf 여야만 하고, 그 다음은 0xff가 되선 안됩니다.
그럼 길게 생각할것 없이 주소를 바꾸면 됩니다.
argv[2]를 엄청 길게 넣어주고 시작 주소를 찾아봅니다.
shell code 앞에 nop slide를 1000-byte를 줘 봤습니다.
0xbffff86d가 나왔습니다.
갈 길이 멉니다.
nop slide를 10000-byte를 줘 봤습니다.
0xbffffd545가 나왔습니다.
아직도 갈 길이 멉니다.
아왜
nop slide를 100000-byte를 줘 봤습니다.
0xbffe75b5가 나왔습니다.
공격합니다.
공격에 성공했습니다.