5번 문제와 동일합니다만 argv[1]의 길이를 체크하는 부분이 추가되어 있습니다.
argv[1]의 길이가 48보다 큰 경우 에러 메시지를 출력하고 종료합니다.
argv[1]은 딱 ret를 덮어쓰는 용도로만 사용 가능하게 되었습니다.
길게 생각할것 없이 간단하게 argv[2]를 씁니다.
argv[1]의 48번째 값을 0xbf로 맞춰주고
argv[2]로 shell code를 넘겨주면 됩니다.
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+232에 Break point를 걸고 stack을 확인해 보겠습니다.
실행할 때 ret 주소값이 0xbf로 시작하게 맞춰줘야 합니다.
shell code가 들어갈 주소는 0xbffffbe1 입니다.
nop slide를 채우고 뒤에 shell code를 입력하고 slide 중간쯤에 return 해주면 됩니다.
공격에 성공했습니다.