6번 문제에서 argc가 2여야 하고, argv[1]을 초기화 하는 부분이 추가되었습니다.
buffer도 초기화 되고, argv[1]도 초기화되므로 남는 부분은 argv[0]입니다.
argv[0]에 shell code를 넣고 풀면 됩니다.
Stack 구조
Low addr
buffer (40-byte)
|
sfp (4-byte)
|
ret (\x00\x00\x00\xbf) |
...
|
argv[0] (shell)
|
argv[1] |
High addr
프로그램 분석을 위해 임시로 컴파일한 파일에 링크를 걸고 gdb로 열어봅니다.
링크를 건 파일의 이름은 shell code로 이루어져 있어야 합니다.
argv[0]은 argv[1] 바로 앞에 있기 때문에 argv[1]에 접근하는 strcpy에 Break point를 걸고 stack을 봅니다.
main+232에 Break point를 걸고 stack을 확인해 보겠습니다.
실행할 때 ret 주소값이 0xbf로 시작하게 맞춰줘야 합니다.
대충 보니 0xbffffb51 부터 nop slide가 보입니다.
이제 공격을 위해 troll에 링크를 걸고 공격합니다.
nop slide 중 아무데나 return 합니다.
실패했습니다.
몇번을 해봐도 안됩니다.
아왜
gdb로 argv[0] 위치 구하는것도 이젠 질립니다.
troll의 소스코드가 있으니 편법을 써보겠습니다.
소스코드 마지막에 argv[0]의 주소를 출력하게 했습니다.
컴파일하고 해당 파일에 위와 같은 방법으로 링크를 걸어줍니다.
링크 파일을 실행합니다.
argv[0]의 위치가 0xbffffaa2라고 나옵니다.
공격해봅니다.
공격에 성공했습니다.