************************************************************************ Á¦¸ñ: ¹ßÀüµÈ IA32 ÇÔ¼ö ÈÄÅ·(ÇÁ·¢ 58È£) ¹ø¿ª: vangelis(http://www.wowhacker.org) * ´ëÃæ ÇßÀ¸´Ï Ȥ½Ã¶óµµ ¿À¿ªÀ̳ª ¿ÀŸ ÀÖÀ¸¸é ¸»¾¸ÇØÁÖ½Ã±æ ¹Ù¶ø´Ï´Ù. ************************************************************************ ==Phrack Inc.== Volume 0x0b, Issue 0x3a, Phile #0x08 of 0x0e |=------------------------=[ ¹ßÀüµÈ IA32 ÇÔ¼ö ÈÄÅ· ]=--------------------------=| |=---------------------------------------------------------------------------=| |=-------------------=[ mayhem ]=---------------------=| |=--------------------------=[ December 08th 2001 ]=-------------------------=| --[ ³»¿ë 1 - µµÀÔ 1.1 - ¿ª»ç 1.2 - »õ·Î¿î ¿ä±¸»çÇ×µé 2 - ÈÄÅ·ÀÇ ±âº»µé 2.1 - ÀϹÝÀûÀÎ Å×Å©´Ðµé 2.2 - Àؾ´Â ¾ÈµÇ´Â °Íµé 3 - ÄÚµå ¼³¸í 4 - ¶óÀ̺귯¸® ÀÌ¿ëÇϱâ 4.1 - API 4.2 - Ä¿³Î ½Éº¼ ºÐ¼® 4.3 - hook_t ¿ÀºêÁ§Æ® 5 - ÄÚµå Å×½ºÆ® 5.1 - ¸ðµâ ·Îµù 5.2 - ³î¾Æº¸ÀÚ 5.3 - ÄÚµå 6 - Âü°í¹®Çå --[ 1 - µµÀÔ ³²¿ë, ·Î±ë, ÆÐÄ¡, ¶Ç´Â ½ÉÁö¾î µð¹ö±ë À̰͵éÀº ÈÄÅ· ¹®Á¦¿¡ ´ëÇØ »ý°¢ÇÒ ºÐ¸íÇÑ ÀÌÀ¯µéÀÌ´Ù. ¿ì¸®´Â ¾î¶»°Ô ±×°ÍÀÌ ÀÛµ¿ÇÒ °ÍÀÎÁö ÀÌÇØÇÏ·Á°í ³ë·ÂÇÒ °ÍÀÌ´Ù. ¿©±â¼­ÀÇ ±âº» ȯ°æÀº ¸®´ª½º Ä¿³ÎÀÌ´Ù. ÀÌ ±ÛÀº Ä¿³Î 2.4.5¿¡¼­ °³¹ßµÇ¾ú°í, IA32°¡ ½ÇÇàµÇ°í ÀÖ´Â ¸®´ª½º Ä¿³Î 2.4 ½Ã¸®ÁîÀÇ ÀϹÝÀûÀÎ ¸ñÀûÀÇ ÈÄÅ· ¶óÀ̺귯¸®¿¡ ´ëÇØ¼­ ´Ù·ç°í ÀÖÀ¸¸ç, ±×°ÍÀº LKH(Linux Kernel Hooker)¶ó°í ºÒ¸°´Ù. ----[ 1.1 - ¿ª»ç ÇÔ¼ö ÇÏÀÌÀçÅ· ÁÖÁ¦¿¡ ´ëÇÑ Âü°í¹®Çåµé ÁßÀÇ Çϳª°¡ 1999³â 11¿ù¿¡ ¹ßÇ¥µÇ¾úÀ¸¸ç, Silvio Cesare¿¡ ÀÇÇØ ¾²¿©Á³´Ù. ÀÌ ±¸ÇöÀº Ä¿³ÎÀÇ acct_process ÇÔ¼ö·Î Á¢±ÙÇÏ´Â °ÍÀ» ÇÊÅ͸µ Çϱâ À§ÇØ Æ¯Á¤ ÇÁ·Î¼¼½º°¡ Â÷ÁöµÇ´Â °ÍÀ» ¸·À¸¸é¼­ ÈÄÅ·ÀÌ ´Ù¸¥ ÄÚµå·Î jumpÇÏ´Â ÇÔ¼öÀÇ Ã¹ ¹ÙÀÌÆ®¸¦ ¼öÁ¤ÇÏ´Â °ÍÀ¸·Î ±¸¼ºµÇ¾î Àֱ⠶§¹®¿¡ ¾ÆÁÖ Á÷¼±ÀûÀÌ´Ù. ----[ 1.2 - »õ·Î¿î ¿ä±¸ »çÇ×µé ±× ÀÌÈÄ ¸î °¡Áö ÀÛ¾÷ÀÌ ÀÌ·ç¾îÁ³´Ù: - ¸®´ÙÀÌ·º¼ÇÀÇ ½Ç¿ëÀûÀÎ »ç¿ëÀº Á¾Á¾(Ç×»ó?) ±×°ÍµéÀÇ ¹øÈ£¿Í »çÀÌÁî¿¡ »ó°ü¾øÀÌ ¿ø·¡ÀÇ ÀÎÀÚ¿¡ Á¢±ÙÇÒ Çʿ䰡 ÀÖ´Ù.(¿¹¸¦ µé¾î ¸¸¾à ¿ì¸®°¡ IP ÆÐŶÀ» ¼öÁ¤Çϰųª Æ÷¿öµù Çϱ⸦ ¿øÇÑ´Ù¸é) - ¿ì¸®´Â ¿ä±¸°¡ ÀÖ´Â Áï½Ã ÈÄÅ©¸¦ ºñȰ¼ºÈ­½Ãų Çʿ䰡 Àִµ¥, ±×°ÍÀº ·±Å¸ÀÓ Ä¿³Î ¼³Á¤À» À§ÇØ ¿Ïº®ÇÏ´Ù. ¿ì¸®´Â ¿ø·¡ÀÇ ÇÔ¼ö¸¦ È£ÃâÇϱ⸦ ¿øÇÒ ¼öµµ Àְųª(¸ð´ÏÅ͸µ ÇÁ·Î±×·¥¿¡ ÀÇÇØ »ç¿ëµÇ´Â ºÐ¸®µÈ ÈÄÅ·), ¶Ç´Â Ä¿³Î ¿ÀºêÁ§Æ®¿¡ ´ëÇØ¼­´Â ¾Æ´Ò ¼ö ÀÖ´Ù.(ACL(Access Control Lists)À» °ü¸®Çϱâ À§ÇÑ º¸¾È ÆÐÄ¡¿¡ ÀÇÇØ »ç¿ëµÇ´Â °ø°ÝÀûÀÎ ÈÄÅ·) - ¾î¶² °æ¿ì¿¡ ¿ì¸®´Â ù ¹øÂ° È£Ãâ ÀÌÈÄ ¿¹¸¦ µé¾î Åë°è(¸ÅÃÊ ¶Ç´Â ¸ÅºÐ¸¶´Ù Çѹø¾¿ ÈÄÅ·ÇÒ ¼ö ÀÖ´Â)¸¦ ³»±â À§ÇØ ÈÄÅ©¸¦ ÆÄ±«Çϱ⸦ ¿øÇÒ ¼ö ÀÖ´Ù. --[ 2 - ÈÄÅ· ±âº» ----[ 2.1 ÀϹÝÀûÀÎ Å×Å©´Ð ¹°·Ð ÇÙ½ÉÀûÀÎ ÈÄÅ· ÄÚµå´Â ¾î¼Àºí¸®¾î¿¡¼­ ÀÌ·ç¾îÁ®¾ß ÇÏÁö¸¸ ÈÄÅ· ·¦ÇÎ ÄÚµå´Â C·Î ÀÌ·ç¾îÁø´Ù. LKHÀÇ ³ôÀº ¼öÁØÀÇ ÀÎÅÍÆäÀ̽º´Â API ¼½¼Ç¿¡¼­ ±â¼úµÈ´Ù. ¸ÕÀú ¸î °¡Áö ÈÄÅ· ±âº»¿¡ ´ëÇØ¼­ ÀÌÇØÇØº¸ÀÚ. ´ÙÀ½ÀÌ ±âº»ÀûÀÎ ÈÄÅ·ÀÌ´Ù. - ´Ù¸¥ ÇϳªÀÇ ÄÚµå('ÈÄÅ· ÄÚµå'¶ó°í ºÒ¸²)¸¦ Áö½ÃÇϱâ À§ÇØ ÇÔ¼ö ÄÚµåÀÇ ½ÃÀÛÀ» º¯°æÇÑ´Ù. À̰ÍÀº ¿ì¸®°¡ ¿øÇÏ´Â °ÍÀ» Çϱâ À§ÇÑ ¾ÆÁÖ ¿À·¡µÇ°í È¿À²ÀûÀÎ ¹æ¹ýÀÌ´Ù. ´Ù¸¥ ¹æ¹ýÀº ÇÔ¼ö¸¦ Âü°íÇÏ´Â ÄÚµå ¼¼±×¸ÕÆ®ÀÇ ¸ðµç È£ÃâÀ» ÆÐÄ¡ÇÏ´Â °ÍÀÌ´Ù. µÎ ¹øÂ° ¹æ¹ýÀº ¸î °¡Áö ÀåÁ¡µéÀ» °¡Áö°í ÀÖÁö¸¸(¾ÆÁÖ Àº¹ÐÇÏ´Ù) ±× ±¸ÇöÀº ¾à°£ º¹ÀâÇϰí(¸Þ¸ð¸® ¿µ¿ªÀº ÆÄ½ÌÀ» ºí·ÏÇϰí, ±×·± ´ÙÀ½ ÄÚµå ½ºÄ³´×À» ºí·ÏÇÑ´Ù), ±×¸®°í ¾ÆÁÖ ºü¸£Áö ¾Ê´Ù. - ·±Å¸ÀÓ ¶§ ÈÄÅ©µÈ ÇÔ¼ö ½ÇÇàÀÌ ³¡³µÀ» ¶§ ÅëÁ¦±ÇÀ» Àâ±â À§ÇØ ÇÔ¼öÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ º¯°æÇÑ´Ù. - ÈÄÅ© ÄÚµå´Â µÎ °¡Áö ´Ù¸¥ ºÎºÐÀ» °¡Áö°í ÀÖ¾î¾ß Çϴµ¥, ù ¹øÂ° °ÍÀº ÇÔ¼ö ¾Õ¿¡¼­ ½ÇÇàµÇ¾î¾ß Çϸç(ÀÎÀÚ¿¡ Á¢±ÙÇϱâ À§ÇÑ ½ºÅÃÀ» Áغñ, callback ½ÇÇà, ÀÌÀü ÇÔ¼ö Äڵ带 º¹±¸), µÎ ¹øÂ°´Â ÇÔ¼ö µÚ¿¡ ½ÇÇàµÇ¾î¾ß ÇÑ´Ù.(ÇÊ¿äÇÏ´Ù¸é ÈÄÅ©¸¦ ´Ù½Ã ¸®¼Â ÇÑ´Ù.) - µðÆúÆ® ÀÎÀÚ(ÈÄÅ© ÇàÀ§¸¦ Á¤ÀÇÇÏ´Â °Í)µéÀº ÈÄÅ©¸¦ ¸¸µé µ¿¾È(ÇÔ¼ö Äڵ带 ¼öÁ¤Çϱâ Àü) ¼³Á¤µÇ¾î¾ß ÇÑ´Ù. ÇÔ¼ö ÀÇÁ¸ÀûÀÎ ÀÎÀÚµéÀº Áö±Ý È®Á¤µÇ¾î¾ß ÇÑ´Ù. - callbackÀ» Ãß°¡ÇÑ´Ù. °¢ callbackÀº ¿ø·¡ÀÇ ÇÔ¼ö ÀÎÀÚ¿¡ Á¢±ÙÇÒ ¼ö Àְųª ½ÉÁö¾î ¼öÁ¤µµ ÇÒ ¼ö ÀÖ´Ù. - ÀÎÀÚµéÀ» Ȱ¼ºÈ­, ºñȰ¼ºÈ­, º¯°æÇϰí, ¿ì¸®°¡ ¿øÇÒ ¶§ callbackÀ» Ãß°¡Çϰųª Á¦°ÅÇÑ´Ù. ----[ 2.2 - ÀØÁö ¸»¾Æ¾ß ÇÒ °Íµé -> ÇÁ·¹ÀÓ Æ÷ÀÎÅÍ ¾ø´Â ÇÔ¼ö: Áß¿äÇÑ ±â´ÉÀº -fomit-frame-pointer gcc ¿É¼ÇÀ¸·Î ÄÄÆÄÀÏµÈ ÇÔ¼öµéÀ» ÈÄÅ©Çϱâ À§ÇÑ ´É·ÂÀÌ´Ù. ÀÌ ±â´ÉÀº %ebp·ÎºÎÅÍ ÀÚÀ¯·Ó±â À§ÇØ ÈÄÅ· Äڵ带 ¿ä±¸ÇÑ´Ù. À̰ÍÀÌ ¿Ö ¿ì¸®°¡ ´ÜÁö %esp°¡ ½ºÅà ¿ÀÆÛ·¹À̼ÇÀ» À§ÇØ »ç¿ëÇÒ °ÍÀΰ¡ÀÇ ÀÌÀ¯ÀÌ´Ù. ¿ì¸®´Â ÈÄÅ© Äڵ忡 ÀÖ´Â %ebp °ü·Ã offsetÀ» ¼öÁ¤Çϱâ À§ÇØ ¸î ºÎºÐÀ» ¾÷µ¥ÀÌÆ®Çؾ߸¸ ÇÑ´Ù.(¸î ºÎºÐ¿¡ ¸î ¹ÙÀÌÆ®¾¿) ÀÌ¿¡ °üÇØ ´õ ÀÚ¼¼ÇÑ °ÍÀº lkh.cÀÇ khook_create()¸¦ º¸¾Æ¶ó. ÈÄÅ© ÄÚµå´Â ¶ÇÇÑ À§Ä¡¿Í µ¶¸³µÇ¾î ÀÖ´Ù. À̰ÍÀÌ ¿Ö ±×·¸°Ô ¸¹Àº ÈÄÅ© Äڵ忡 offsetÀÌ ·±Å¸Àӽà °íÁ¤µÇ¾î Àִ°¡ÀÇ ÀÌÀ¯ÀÌ´Ù.(¿ì¸®°¡ Ä¿³Î¿¡ Àֱ⠶§¹®¿¡ offsetÀº ÈÄÅ©¸¦ ¸¸µå´Â µ¿¾È °íÁ¤µÇ¾î¾ß ÇÏÁö¸¸, ¾ÆÁÖ À¯»çÇÑ Å×Å©´ÐÀÌ ·±Å¸ÀÓ ÇÁ·Î¼¼½º¿¡ ÇÔ¼ö ÈÄÅ· µ¿¾È »ç¿ëµÉ ¼ö ÀÖ´Ù.) -> Àç±Í ¿ì¸®´Â callbackÀ¸·ÎºÎÅÍ ¿ø·¡ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ¾î¾ß Çϸç, ±×·¡¼­ ¿ø·¡ÀÇ ÄÚµå´Â ¾î¶² callbackÀÇ ½ÇÇà ÀÌÀü¿¡ ÀúÀåµÇ¾î¾ß ÇÑ´Ù. -> ¸®ÅÏ °ª ¿ì¸®°¡ callbackÀ» °¡Áö°í ÀÖ´ø ¾Æ´Ï´ø, ¿ø·¡ÀÇ ÇÔ¼ö°¡ È£ÃâµÇ´ø ¾Æ´Ï´ø %eax¿¡ Á¤È®ÇÑ °ªÀ» ¸®ÅÏÇØ¾ß ÇÑ´Ù. ¸¶Áö¸·À¸·Î ½ÇÇàµÈ callbackÀÇ ¸®ÅϰªÀº ¸¸¾à ¿ø·¡ÀÇ ÇÔ¼ö°¡ È£ÃâµÇÁö ¾ÊÀ» °æ¿ì ¸®ÅϵȴÙ. ¸¸¾à ¾î¶² callbackÀ̳ª ¿ø·¡ÀÇ ÇÔ¼öµµ È£ÃâµÇÁö ¾Ê´Â´Ù¸é ¸®ÅϰªÀº ÅëÁ¦ÇÒ ¼ö ¾ø´Ù. -> POST callback ¸¸¾à ¿ø·¡ÀÇ ÇÔ¼ö µÚ¿¡ callbackÀ» ½ÇÇàÇÒ °æ¿ì ÇÔ¼ö ÀÎÀڵ鿡 Á¢±ÙÇÒ ¼ö ¾ø´Ù. ±×°ÍÀÌ ¿Ö ³ª»Û »ý°¢Àΰ¡ÀÇ ÀÌÀ¯ÀÌ´Ù. ÇÏÁö¸¸, ±×°ÍÀ» ÇÏ´Â Å×Å©´ÐÀÌ ÀÖ´Ù. - ÈÄÅ©¸¦ aggressive·Î ¼³Á¤ - PRE callbackÀ» È£Ãâ - ÀÚ½ÅÀÇ ÀÎÀÚ·Î callbackÀ¸·ÎºÎÅÍ ¿ø·¡ ÇÔ¼ö¸¦ È£Ãâ - POST callbackÀ» È£Ãâ --[ 3 - ÄÚµå ¼³¸í ¸ÕÀú ÈÄÅ©¸¦ ¼³Ä¡ÇÑ´Ù. A - ÈÄÅ© ÄÚµå ¿µ¿ªÀ» °¡¸®Å°°í ÀÖ´Â °£Á¢ÀûÀÎ jump·Î ÇÏÀÌÀçÅ·µÈ ·çƾÀÇ Ã³À½ 7¹ÙÀÌÆ®¸¦ µ¤¾î¾´´Ù. %eax¿¡ ÀÔ·ÂµÈ offsetÀº ÈÄÅ© ÄÚµåÀÇ Àý´ë ÁÖ¼ÒÀ̸ç, ±×·¡¼­ ¿ì¸®°¡ hijack_me() ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§¸¶´Ù, ÈÄÅ© ÄÚµå´Â ÅëÁ¦µÉ °ÍÀÌ´Ù. ÇÏÀÌÀçÅ· Àü: 0x80485ec : mov 0x4(%esp,1),%eax 0x80485f0 : push %eax 0x80485f1 : push $0x8048e00 0x80485f6 : call 0x80484f0 0x80485fb : add $0x8,%esp ÇÏÀÌÀçÅ· ÈÄ: 0x80485ec : mov $0x804a323,%eax 0x80485f1 : jmp *%eax 0x80485f3 : movl (%eax,%ecx,1),%es 0x80485f6 : call 0x80484f0 0x80485fb : add $0x8,%esp jmp ´ÙÀ½¿¡ µå·¯³­ 3°³ÀÇ ¸í·ÉÀº ¾î¶² °Íµµ ÀǹÌÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé gdb´Â ¿ì¸®ÀÇ ÈÄÅ©¿¡ ÀÇÇØ ³ó¶ô ´çÇÑ °ÍÀ̱⠶§¹®ÀÌ´Ù. B - ÈÄÅ©µÈ ÇÔ¼öÀÇ ¿ø·¡ ¹ÙÀÌÆ®¸¦ ¸®¼Â, ¸¸¾à ¿ì¸®°¡ ¾î¶² °ÍÀ» ÆÄ±«ÇÏÁö ¾Ê°í ¿ø·¡ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÏ±æ ¿øÇÑ´Ù¸é ±×°ÍÀÌ ÇÊ¿äÇÏ´Ù. pusha movl $0x00, %esi (1) movl $0x00, %edi (2) push %ds pop %es cld xor %ecx, %ecx movb $0x07, %cl rep movsl µÎ °³ÀÇ NULL offsetÀº ÈÄÅ©¸¦ ¸¸µé µ¿¾È ½ÇÁ¦·Î º¯°æµÇ¾ú´Ù.(±×µéÀÇ °ªÀÌ ÈÄÅ©µÈ ÇÔ¼öÀÇ offset¿¡ ÀÇÁ¸Çϱ⠶§¹®¿¡ ¿ì¸®´Â ·±Å¸Àӽà ÈÄÅ© Äڵ带 ÆÐÄ¡ÇØ¾ß ÇÑ´Ù.) (1)Àº ¿ø·¡ ÇÔ¼öÀÇ Ã¹¹øÂ° ÀúÀåµÈ 7 ¹ÙÀÌÆ®¸¦ Æ÷ÇÔÇϰí ÀÖ´Â ¹öÆÛÀÇ offset¿¡ °íÁ¤µÇ¾î ÀÖ´Ù. (2)´Â ¿ø·¡ÀÇ ÇÔ¼ö ¾îµå·¹½º·Î °íÁ¤µÇ¾î ÀÖ´Ù. ¸¸¾à x86 ¾î¼Àºí¸®¾î¸¦ Àß ¾Ë°í ÀÖ´Ù¸é ´ç½ÅÀº ÀÌ ¸í·ÉµéÀÌ %ds:%esi·ÎºÎÅÍ %es:%edi·Î %ecx ¹ÙÀÌÆ®¸¦ º¹»çÇÒ °ÍÀ̶ó´Â °ÍÀ» ¾Ë¾Æ¾ß ÇÑ´Ù. ÀÌ¿¡ ´ëÇÑ °ÍÀº [2]¸¦ Âü°íÇØ¶ó. C - ÀμöµéÀÌ ¿ì¸®ÀÇ callbackÀ» Àаí/¾²±â ±ÇÇÑÀ» °®°í callbackÀ» ½ÇÇàÇϵµ·Ï ½ºÅÃÀ» ÃʱâÈ­ÇÑ´Ù. ¿ì¸®´Â ù ¹øÂ° ¿ø·¡ ÆÄ¶ó¹ÌÅÍ ÁÖ¼Ò¸¦ %eax¿¡ À̵¿½Ã۰í, ±×·± ´ÙÀ½ ±×°ÍÀ» push ÇÑ´Ù. leal 8(%esp), %eax push %eax nop; nop; nop; nop; nop nop; nop; nop; nop; nop nop; nop; nop; nop; nop nop; nop; nop; nop; nop nop; nop; nop; nop; nop nop; nop; nop; nop; nop nop; nop; nop; nop; nop nop; nop; nop; nop; nop ºó ½½·ÔÀº NOP ¸í·É(opcode 0x90)À¸·Î °¡µæ Â÷ ÀÖ´Ù´Â °ÍÀ» ÁÖ¸ñÇØ¶ó. À̰ÍÀº ¾î¶² ¿ÀÆÛ·¹À̼ǵµ ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¾î¶² ½½·ÔÀÌ khook_add_entry ÇÔ¼ö¸¦ »ç¿ëÇØ °¡µæ Â÷ ÀÖ´Ù¸é 5 ¹ÙÀÌÆ®°¡ »ç¿ëµÈ´Ù. - È£Ãâ opcode (opcode 0xE8) - callback offset (4 bytes relative address) ¿ì¸®´Â ÃÖ´ë 8°³ÀÇ callbackÀ» ¼³Á¤Çϵµ·Ï ¼±ÅÃÇß´Ù. »ðÀÔµÈ °¢°¢ÀÇ callbackÀº ÇϳªÀÇ ÀÎÀڷΠȣÃâµÈ´Ù.(%eax°¡ push µÈ °ªÀº ½ºÅÃÀ» ´Ù½Ã ¹èÄ¡Çϸ鼭 ¿ø·¡ÀÇ ÇÔ¼ö ÆÄ¶ó¹ÌÅÍÀÇ ÁÖ¼Ò¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù.) D - ½ºÅà ¸®¼Â add $0x04, %esp ¿ì¸®´Â ÀÌÁ¦ (C)¿¡¼­ pushµÈ ¿ø·¡ ÇÔ¼öÀÇ ÀÎÀÚ ÁÖ¼Ò¸¦ Á¦°ÅÇÑ´Ù. ±×·± ½ÄÀ¸·Î %esp´Â ±×°ÍÀÇ ÀÌÀü °ª(C ´Ü°è·Î µé¾î°¡±â ÀÌÀüÀÇ °Í)À¸·Î ¸®¼ÂµÈ´Ù. ÀÌ ¼ø°£¿¡ ½ºÅÃÀº A´Ü°è¿¡¼­ µ¤¾î¾²¿´±â ¶§¹®¿¡ ¿ø·¡ ÇÔ¼öÀÇ ½ºÅà ÇÁ·¹ÀÓÀ» Æ÷ÇÔÇϰí ÀÖÁö´Â ¾Ê´Ù. E - ½ºÅÿ¡ ¿ø·¡ ÇÔ¼öÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ º¯°æÇÑ´Ù. ÀÎÅÚ ÇÁ·Î¼¼½º¿¡¼­´Â ÇÔ¼öÀÇ ¸®ÅÏ ¾îµå·¹½º´Â ½ºÅÿ¡ ÀúÀåµÈ´Ù.(À̰ÍÀº º¸¾È»óÀ¸·Î´Â ÁÁÀº »ý°¢Àº ¾Æ´Ï´Ù.) ÀÌ º¯°æÀº ¿ø·¡ÀÇ ÇÔ¼ö ½ÇÇà ÀÌÈÄ ¿ì¸®°¡ ¿øÇÏ´Â °÷(hook-code·Î)À¸·Î ¸®ÅÏÇÏ°Ô ÇØÁØ´Ù. ±×·± ´ÙÀ½ ¿ì¸®´Â ¿ø·¡ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ¸®ÅϽà ÈÄÅ© ÄÚµå´Â ÅëÁ¦±ÇÀ» ÀçȹµæÇÑ´Ù. ±×°ÍÀ» Á¶½É½º·´°Ô »ìÆìº¸ÀÚ. -> ¸ÕÀú ¿ì¸®´Â ½ÇÁ¦ %eip¸¦ ±¸Çϰí, ±×°ÍÀ» %esi¿¡ ÀúÀåÇÑ´Ù.(¸¶Áö¸· ¶óº§Àº E5 ´Ü°è¿¡¼­ ½±°Ô È®ÀÎÇÒ ¼ö ÀÖ´Â ¸î¸î Äڵ带 °¡¸®Å²´Ù) ÀÌ Æ®¸¯Àº Ç×»ó À§Ä¡¿Í µ¶¸³µÈ Äڵ忡¼­ »ç¿ëµÈ´Ù. 1. jmp end begin: pop %esi -> ±×·± ´ÙÀ½ ¿ì¸®´Â 4(%esp)¿¡ Àç¹èÄ¡Çϸ鼭 ÀÌÀü ¸®ÅÏ ¾îµå·¹½º¸¦ ¸¸È¸Çϰí, ±×°ÍÀ» %eax¿¡ ÀúÀåÇÑ´Ù. 2. movl 4(%esp), %eax -> ¿ì¸®´Â ÈÄÅ© ÄÚµåÀÇ ³¡¿¡ 4 ¹ÙÀÌÆ® offsetÀ¸·Î ÀúÀåµÈ ¸®ÅÏ ¾îµå·¹½º¸¦ »ç¿ëÇÑ´Ù.(H ´Ü°è¿¡¼­ NULL Æ÷ÀÎÅ͸¦ º¸¶ó) ±×·¡¼­ ¿ì¸®´Â ÈÄÅ· ÇÁ·Î¼¼½ºÀÇ ³¡¿¡ ¿Ã¹Ù¸¥ °÷À¸·Î ¸®ÅÏÇÒ ¼ö ÀÖ´Ù. 3. movl %eax, 20(%esi) -> ¿ì¸®´Â ¿ø·¡ ÇÔ¼öÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ º¯°æÇϰí, ±×·¡¼­ 'call begin' ¸í·É ¹Ù·Î ´ÙÀ½¿¡ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù. 4. movl %esi, 4(%esp) movl $0x00, %eax -> ¿ì¸®´Â ¿ø·¡ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. 'end' ¶óº§ÀÌ 1´Ü°è¿¡¼­ »ç¿ëµÇ°í, 'begin' ¶óº§Àº "jmp end"(¿©ÀüÈ÷ 1´Ü°è¿¡ ÀÖÀ½) ¹Ù·Î ´ÙÀ½ÀÇ Äڵ带 °¡¸®Å²´Ù. ¿ø·¡ÀÇ ÇÔ¼ö´Â 'call begin' ¸í·É ¹Ù·Î ´ÙÀ½¿¡ ¸®ÅÏÇÑ´Ù. ¿Ö³ÄÇÏ¸é ¿ì¸®°¡ ±×°ÍÀÇ ¸®ÅÏ ¾îµå·¹½º¸¦ º¯°æÇ߱⠶§¹®ÀÌ´Ù. 5. jmp *%eax end: call begin F - ÈÄÅ· ÄÚµå·Î µ¹¾Æ°£´Ù. ¿ì¸®´Â ¿ø·¡ ÇÔ¼öÀÇ Äڵ忡 7 ¹ÙÀÌÆ®¸¦ ´Ù½Ã ¼³Á¤ÇÑ´Ù. ÀÌ ¹ÙÀÌÆ®´Â ±× ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡ ¿ø·¡ÀÇ °ªÀ¸·Î ¸®¼Â µÇ¾ú´Ù. ±×·¡¼­ ¿ì¸®´Â A ´Ü°è¿¡¼­Ã³·³ ´Ù½Ã ±× ÇÔ¼ö¸¦ ÈÄÅ·ÇÒ Çʿ䰡 ÀÖ´Ù. ÀÌ ´Ü°è´Â ¸¸¾à ÈÄÅ©°¡ ¿µ¿øÇÏÁö ¾Ê°í ´Ü¹ßÀûÀ̶ó¸é NOP ¸í·É¿¡ ÀÇÇØ ´ëüµÈ´Ù. ±×·¡¼­ ¿ì¸®ÀÇ ¾ÇÀÇÀûÀÎ °£Á¢Àû jump(A ´Ü°è)ÀÇ 7 ¹ÙÀÌÆ®´Â ´Ù½Ã º¹»çµÇÁö ¾Ê´Â´Ù. ÀÌ ´Ü°è´Â °°Àº copy ¸ÅÄ¿´ÏÁò(rep movs* ¸í·ÉÀ» »ç¿ë)À» »ç¿ëÇϱ⠶§¹®¿¡ B ´Ü°è¿Í ¾ÆÁÖ °¡±õ´Ù. Äڵ忡¼­ NULL offsetÀº ÈÄÅ· °úÁ¤µ¿¾È °íÁ¤µÇ¾î¾ß ÇÑ´Ù. - ù ¹øÂ° °Í(Ãâ¹ßÁö ¹öÆÛ)Àº ¾ÇÀÇÀûÀÎ ¹ÙÀÌÆ® ¹öÆÛ¿¡ ÀÇÇØ ´ëüµÇ¾ú´Ù. - µÎ ¹øÂ° °Í(¸ñÀûÁö ¹öÆÛ)Àº ¿ø·¡ ÇÔ¼öÀÇ ¿£Æ®¸® Æ÷ÀÎÅÍ ¾îµå·¹½º¿¡ ÀÇÇØ ´ëüµÇ¾ú´Ù. movl $0x00, %esi movl $0x00, %edi push %ds pop %es cld xor %ecx, %ecx movb $0x07, %cl rep movsb G - E2 ´Ü°è¿¡¼­ ÀúÀåµÈ ¿ø·¡ ¸®ÅÏ ¾îµå·¹½º¸¦ »ç¿ëÇϰí, ¿ø·¡ÀÇ È£Ãâ ÇÔ¼ö·Î µ¹¾Æ°£´Ù. NULL offset(* Ç¥½Ã ºÎºÐ)Àº ¿ø·¡ÀÇ ÇÔ¼ö ¸®ÅÏ ¾îµå·¹½º¿Í ´õºÒ¾î E2 ´Ü°è¿¡¼­ °íÁ¤µÇ¾î¾ß ÇÑ´Ù. %ecx °ªÀº ½ºÅÿ¡ pushµÇ°í, ±×·¡¼­ ´ÙÀ½ ret ¸í·ÉÀº ¸¶Ä¡ ±×°ÍÀÌ ½ºÅÿ¡ ÀúÀåµÈ %eip ·¹Áö½ºÅÍÀÎ °Íó·³ ±×°ÍÀ» »ç¿ëÇÒ °ÍÀÌ´Ù. À̰ÍÀº Á¤È®ÇÑ ¿ø·¡ÀÇ Àå¼Ò·Î ¸®ÅÏ ÇÑ´Ù. movl $0x00, %ecx * pushl %ecx ret --[ 4 - ¶óÀ̺귯¸® »ç¿ëÇϱâ ----[ 4.1 - API LKH API´Â »ç¿ëÇϱ⿡ ¾ÆÁÖ ½±´Ù : hook_t *khook_create(int addr, int mask); ¾îµå·¹½º 'addr'¿¡ ÈÄÅ©¸¦ »ý¼º. µðÆúÆ® ŸÀÔ(HOOK_PERMANENT or HOOK_SINGLESHOT), µðÆúÆ® »óÅÂ(HOOK_ENABLED or HOOK_DISABLED), ±×¸®°í µðÆúÆ® ¸ðµå(HOOK_AGGRESSIVE or HOOK_DISCRETE)¸¦ ÁØ´Ù. ŸÀÔ, »óÅÂ, ±×¸®°í ¸ðµå´Â 'mask' ÀÎÀÚ¿¡¼­ OR'dÀÌ´Ù. void khook_destroy(hook_t *h); ÈÄÅ© ÀÚ¿øÀ» ºñȰ¼ºÈ­, ÆÄ±«, ±×¸®°í ÀÚÀ¯·Ó°Ô ÇÔ int khook_add_entry(hook_t *h, char *routine, int range); 'range' rank¿¡ ÀÖ´Â ÈÄÅ©¿¡ callbackÀ» Ãß°¡. ¸¸¾à ÁÖ¾îÁø rank°¡ À¯È¿ÇÏÁö ¾Ê´Ù¸é -1À» ¸®ÅÏÇϰí, ´Ù¸¥ °æ¿ì¿¡ 0À» ¸®ÅÏ int khook_remove_entry(hook_t *h, int range); ½½·Ô 'range'¿¡ callback putÀ» Á¦°ÅÇϰí, ÁÖ¾îÁø rank°¡ À¯È¿ÇÏÁö ¾ÊÀ» °æ¿ì -1À» ¸®ÅÏÇϰí, ´Ù¸¥ °æ¿ì 0À» ¸®ÅÏÇÑ´Ù. void khook_purge(hook_t *h); ÀÌ ÈÄÅ©¿¡ ÀÖ´Â ¸ðµç callbackÀ» Á¦°Å int khook_set_type(hook_t *h, char type); ÈÄÅ© 'h' ŸÀÔÀ» º¯°æÇÑ´Ù. ÀÌ Å¸ÀÔÀº HOOK_PERMANENT(ÈÄÅ©ÄÚµå´Â ÈÄÅ©µÈ ÇÔ¼ö°¡ È£ÃâµÉ ¶§¸¶´Ù ½ÇÇàµÈ´Ù.) ¶Ç´Â HOOK_SINGLESHOT(ÈÄÅ©ÄÚµå´Â ´ÜÁö 1 ÇÏÀÌÀçÅ©¿¡¸¸ ½ÇÇàµÇ°í, ±×·± ´ÙÀ½ ÈÄÅ©´Â ±ú²ýÇÏ°Ô Á¦°ÅµÈ´Ù.) int khook_set_state(hook_t *h, char state); ÈÄÅ© 'h'¿ë state¸¦ º¯°æ. state´Â HOOK_ENABLED(ÈÄÅ©´Â Ȱ¼ºÈ­) ¶Ç´Â HOOK_DISABLED(ÈÄÅ©´Â ºñȰ¼ºÈ­)°¡ µÉ ¼ö ÀÖ´Ù. int khook_set_mode(hook_t *h, char mode); ÈÄÅ© 'h'¿ë ¸ðµå¸¦ º¯°æ. ¸ðµå´Â HOOK_AGGRESSIVE(ÈÄÅ©´Â ÇÏÀÌÀçÅ©µÈ ÇÔ¼ö¸¦ È£ÃâÇÏÁö ¾Ê´Â´Ù) ¶Ç´Â HOOK_DISCRETE(ÈÄÅ©´Â callback ·çƾÀ» ½ÇÇàÇÑ ÀÌÈÄ ÇÏÀÌÀçÅ©µÈ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù)°¡ µÉ ¼ö ÀÖ´Ù. ÈÄÅ© ÄÚµåÀÇ ¸î ºÎºÐÀº ¸¸¾à ÈÄÅ©°¡ °ø°ÝÀûÀ̶ó¸é(E ¹× H ´Ü°è) nopÈ­ µÈ´Ù.(no operation ¸í·É¿¡ ÀÇÇØ µ¤¾î ¾²ÀÓ) int khook_set_attr(hook_t *h, int mask); µ¶Æ¯ÇÑ ÇÔ¼ö È£ÃâÀ» ÅëÇØ ¸ðµå, state, ±×¸®°í/¶Ç´Â ŸÀÔÀ» º¯°æÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ¼º°øÇÒ °æ¿ì 0À» ¸®ÅÏÇϰí, ¶Ç´Â ¸¸¾à ÁöÁ¤µÈ mask°¡ ¾ç¸³µÇÁö ¾ÊÀº ¿É¼ÇÀ» Æ÷ÇÔÇϰí ÀÖÀ» °æ¿ì -1À» ¸®ÅÏÇÑ´Ù. ¿ì¸®°¡ ¿øÇÒ ¶§¸¶´Ù »ç¿ëµÈ ÈÄÅ©ÀÇ ¾î¶² state, ŸÀÔ, ±×¸®°í ¸ðµå¶óµµ Ãß°¡Çϰųª Á¦°ÅÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇÏÀÚ. ----[ 4.2 - Ä¿³Î ½Éº¼ ºÐ¼® ½Éº¼ ºÐ¼® ÇÔ¼ö°¡ exportµÈ ÇÔ¼ö°ª¿¡ Á¢±ÙÇÏ´Â °ÍÀ» Çã¿ëÇϵµ·Ï LKH¿¡ Ãß°¡µÇ¾ú´Ù. int ksym_lookup(char *name); ¸¸¾à ½Éº¼ÀÌ °áÁ¤µÇÁö ¾ÊÀº °æ¿ì NULLÀ» ¸®ÅÏÇÑ´Ù´Â °ÍÀ» ÁÖ¸ñÇÏÀÚ. ÀÌ lookupÀº Ä¿³ÎÀÇ __ksymtab ¼½¼Ç¿¡ Æ÷ÇÔµÈ ½Éº¼µéÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ ½Éº¼µéÀÇ ¸ñ·ÏÀº 'ksyms -a'À» ½ÇÇàÇϸé ÀμâµÈ´Ù. bash-2.03# ksyms -a | wc -l 1136 bash-2.03# wc -l /boot/System.map 14647 /boot/System.map bash-2.03# elfsh -f /usr/src/linux/vmlinux -s # displaying sections [SECTION HEADER TABLE] (nil) --- foffset: (nil) 0 bytes [*Unknown*] (...) 0xc024d9e0 a-- __ex_table foffset: 0x14e9e0 5520 bytes [Program data] 0xc024ef70 a-- __ksymtab foffset: 0x14ff70 9008 bytes [Program data] 0xc02512a0 aw- .data foffset: 0x1522a0 99616 bytes [Program data] (...) (nil) --- .shstrtab foffset: 0x1ad260 216 bytes [String table] (nil) --- .symtab foffset: 0x1ad680 245440 bytes [Symbol table] (nil) --- .strtab foffset: 0x1e9540 263805 bytes [String table] [END] »ç½Ç, ¸Þ¸ð¸®°¡ ¸ÊÇÎµÈ ¼½¼Ç __ksymtabÀº ¿ì¸®°¡ ÇÏÀÌÀçÅ·ÇϰíÀÚ ¿øÇÏ´Â ¸ðµç Ä¿³Î ½Éº¼À» Æ÷ÇÔÇϰí ÀÖÁö´Â ¾Ê´Ù. ´Ù½Ã ¸»ÇØ, ¸ÊÇεÇÁö ¾ÊÀº ¼½¼Ç .symtabÀº È®½ÇÈ÷ ´õ Å©´Ù(245440 ¹ÙÀÌÆ® vs 9008 ¹ÙÀÌÆ®). 'ksyms'¸¦ »ç¿ëÇÒ ¶§ __NR_query_module syscall (¶Ç´Â ÀÌÀü Ä¿³Î¿ë __NR_get_kernel_syms)Àº ³»ºÎÀûÀ¸·Î »ç¿ëµÇ¸ç, __ksymtab¿¡ Æ÷ÇÔµÈ ¿Ïº®ÇÑ Ä¿³Î ½Éº¼ Å×À̺íÀÌ ¸Þ¸ð¸®¿¡ ·ÎµùµÇÁö ¾Ê±â ¶§¹®¿¡ ÀÌ syscallÀº __ksymtab ¼½¼Ç¿¡¸¸ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. Àüü ½Éº¼ Å×À̺í·Î Á¢±ÙÇÏ´Â °ÍÀÇ ÇØ°áÃ¥Àº ¿ì¸®ÀÇ System.map ÆÄÀÏ(`nm -a vmlinux > System.map`À» »ç¿ëÇØ ¸¸µç´Ù)¿¡ offsetÀ» ÇȾ÷ÇÏ´Â °ÍÀÌ´Ù. bash-2.03# ksyms -a | grep sys_fork bash-2.03# grep sys_fork /boot/System.map c0105898 T sys_fork bash-2.03# #define SYS_FORK 0xc0105898 if ((s = khook_create((int) SYS_FORK, HOOK_PERMANENT, HOOK_ENABLED)) == NULL) KFATAL("init_module: Cant set hook on function *sys_fork* ! \n", -1); khook_add_entry(s, (int) fork_callback, 0); #undef SYS_FORK ½Ã½ºÅÛÀÌ System.map ¶Ç´Â ¾ÐÃàµÇÁö ¾ÊÀº Ä¿³Î À̹ÌÁö(vmlinux)¸¦ °¡Áö°í ÀÖÁö ¾Ê±â ¶§¹®¿¡ vmlinux ÆÄÀÏÀ» ¾ÐÃàÀ» Ǫ´Â °ÍÀÌ ¹Þ¾Æµé¿©Áú ¼ö ÀÖ´Ù.(À̰ÍÀÌ Ç¥ÁØ gzip Æ÷¸ËÀÌ ¾Æ´ÔÀ» ±â¾ïÇØ¶ó.) [3]Àº À̰Ϳ¡ ´ëÇÑ ¾ÆÁÖ À¯¿ëÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖÀ¸¸ç), ±×¸®°í Á÷Á¢ »õ·Î¿î System.map ÆÄÀÏÀ» ¸¸µç´Ù. ¶Ç ´Ù¸¥ ¹æ¹ýÀº Åë°è ±â¹ÝÀÇ Á¶»çÀÌ´Ù. Ä¿³Î 16Áø¼ö Äڵ忡¼­ ·¹ÆÛ·±½º¸¦ ºÐ¼®ÇÏ´Â °ÍÀº ¿ì¸®°¡ ½Éº¼ °ªÀ» ¿¹»óÇÏ´Â °ÍÀ» °¡´ÉÇÏ°Ô Çϰí(È£Ãâ ¶Ç´Â jmp ¸í·ÉÀ» ºÒ·¯¿À´Â °Í), Ä¿³Î ÄÚµå´Â ¹öÀü¸¶´Ù ´Ù¸£±â ¶§¹®¿¡ ÀÌ ÅøÀÇ ¾î·Á¿òÀº À̽ÄÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀÌ´Ù. SYS_FORK¸¦ ´ç½Å ÀÚ½ÅÀÇ sys_fork offset °ªÀ¸·Î º¯°æÇÏ´Â °ÍÀ» ÀØÁö ¸¶¶ó. ----[ 4.3 - LKH Internals: hook_t ¿ÀºêÁ§Æ® hook_t ±¸Á¶(¸Þ¸ð¸®¿¡¼­ ÈÄÅ© Ç׸ñ)¸¦ »ìÆìº¸ÀÚ. typedef struct s_hook { int addr; int offset; char saved_bytes[7]; char voodoo_bytes[7]; char hook[HOOK_SIZE]; char cache1[CACHE1_SIZE]; char cache2[CACHE2_SIZE]; } hook_t; h->addr ¿ø·¡ ÇÔ¼öÀÇ ÁÖ¼Ò. ÈÄÅ©¸¦ Ȱ¼ºÈ­ ¶Ç´Â ºñȰ¼ºÈ­ Çϴµ¥ »ç¿ëµÊ h->offset ÀÌ Çʵå´Â h->addrÀ¸·ÎºÎÅÍÀÇ offsetÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. ¿©±â¼­ ÇÏÀÌÀçÅ·À» ¼³Á¤Çϱâ À§ÇØ µ¤¾î¾²±â¸¦ ½ÃÀÛ. ±×°ÍÀÇ °ªÀº 3 ¶Ç´Â 0À̸ç, ÇÔ¼ö°¡ ½ºÅà ÇÁ·¹ÀÓÀ» °¡Áö°í ÀÖ´Â³Ä ¾Æ´Ï³Ä¿¡ µû¶ó ´Þ¶óÁø´Ù. h->original_bytes ¿ø·¡ ÇÔ¼öÀÇ µ¤¾î ¾²¿©Áø 7¹ÙÀÌÆ® h->voodoo_bytes ¸®´ÙÀÌ·ºÆ®Çϱâ À§ÇØ ÇÔ¼öÀÇ ½ÃÀۺκп¡ ÀÔ·ÂÇÒ Çʿ䰡 ÀÖ´Â 7¹ÙÀÌÆ®(3¹®´ÜÀÇ A ´Ü°è¿¡¼­ º» °£Á¢ÀûÀÎ jump Äڵ带 Æ÷ÇÔÇϰí ÀÖ´Ù.) h->hook ÈÄÅ· Äڵ带 Æ÷ÇÔÇϰí ÀÖ´Â opcode ¹öÆÛ, ¿©±â¿¡ khook_add_entry()¸¦ »ç¿ëÇØ callback ·¹ÆÛ·±½º¸¦ »ðÀÔÇÑ´Ù. cache1 ¹× cache2 ¹öÆÛ´Â ¿ì¸®°¡ ¸ðµå HOOK_AGGRESSIVE¸¦ ¼³Á¤ÇÒ ¶§ ÈÄÅ© Äڵ带 ¹é¾÷Çϱâ À§ÇØ »ç¿ëµÈ´Ù. (¿ø·¡ÀÇ ÇÔ¼ö È£ÃâÀ» nop ÇØ¾ßÇϱ⠶§¹®¿¡ ÀÌ Äڵ带 ÀúÀåÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. ÈÄÅ©¸¦ ¸¸µé ¶§¸¶´Ù hook_tÀÇ ¿¹°¡ ¼±¾ðµÇ°í ÇÒ´çµÈ´Ù. ÇÏÀÌÀçÅ· ÇϰíÀÚ ¿øÇÏ´Â ÇÔ¼ö¸¶´Ù ÇϳªÀÇ ÈÄÅ©¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ----[ 5 - ÄÚµå Å×½ºÆ® ¸ÕÀú »õ·Î¿î Äڵ忡 ´ëÇØ¼­´Â http://www.devhell.org/~mayhem/¸¦ È®ÀÎÇØº¸¾Æ¶ó. ÀÌ ÆÐŰÁö(¹öÀü 1.1)´Â ÀÌ ±ÛÀÇ ³¡ºÎºÐ¿¡ ÁÖ¾îÁ® ÀÖ´Ù. #include "lkh.c"·Î Á·ÇÏ´Ù. LKH¸¦ »ç¿ëÇÏ´Â ÀÌ ¸ðµâÀÇ ¿¹¿¡¼­ ¿ì¸®´Â ´ÙÀ½À» ÈÄÅ·Çϱ⸦ ¿øÇÑ´Ù. - hijack_me() ÇÔ¼ö, ¿©±â¼­ ÁÁÀº ÆÄ¶ó¹ÌÅͰ¡ Áö³ª°¡´Â °Í°ú callbackÀ» ÅëÇÑ ¼öÁ¤À» üũÇÒ ¼ö ÀÖ´Ù. - schedule() ÇÔ¼ö, SINGLESHOT ÇÏÀÌÀçÅ·. - sys_fork() ÇÔ¼ö, PERMANENT ÇÏÀÌÀçÅ·. ------[ 5.1 - ¸ðµâ ·Îµù bash-2.03# make load insmod lkh.o Testing a permanent, aggressive, enabled hook with 3 callbacks: A in hijack_one = 0 -OK- B in hijack_one = 1 -OK- A in hijack_zero = 1 -OK- B in hijack_zero = 2 -OK- A in hijack_two = 2 -OK- B in hijack_two = 3 -OK- -------------------- Testing a disabled hook: A in HIJACKME!!! = 10 -OK- B in HIJACKME!!! = 20 -OK- -------------------- Calling hijack_me after the hook destruction A in HIJACKME!!! = 1 -OK- B in HIJACKME!!! = 2 -OK- SCHEDULING! ------[ 5.2 - ³î¾Æº¸ÀÚ bash-2.05# ls FORKING! Makefile doc example.c lkh.c lkh.h lkh.o user user.c user.h user.o bash-2.05# pwd /usr/src/coding/LKH (FORKING!À» ÇÁ¸°ÅÍÇÏÁö ¾Ê¾Ò´Ù. ¿Ö³ÄÇϸé pwd´Â ½© ±â¹ÝÀÇ ¸í·ÉÀ̱⠶§¹®ÀÌ´Ù.) bash-2.05# make unload FORKING! rmmod lkh; LKH unloaded - sponsorized by the /dev/hell crew! bash-2.05# ls Makefile doc example.c lkh.c lkh.h lkh.o user user.c user.h user.o bash-2.05# sys_fork() Ä¿³Î ÇÔ¼ö°¡ È£ÃâµÉ ¶§¸¶´Ù ""FORKING!"À» º¼ ¼ö ÀÖÀ¸¸ç(ÈÄÅ©´Â ¿µ¿øÇÔ), schedule() Ä¿³Î ÇÔ¼ö°¡ óÀ½À¸·Î È£ÃâµÉ ¶§¸¶´Ù "SCHEDULING!"À» º¼ ¼ö ÀÖ´Ù.(ÀÌ ÈÄÅ©´Â SINGLESHOTÀ̱⠶§¹®¿¡ schedule() ÇÔ¼ö´Â ´ÜÁö Çѹø¸¸ ÇÏÀÌÀçÅ·µÇ°í, ±×·± ´ÙÀ½ ÈÄÅ©°¡ Á¦°ÅµÈ´Ù. ------[ 5.3 - ÄÚµå /* ** LKH demonstration code, developped and tested on Linux x86 2.4.5 ** ** The Library code is attached . ** Please check http://www.devhell.org/~mayhem/ for updates . ** ** This tarball includes a userland code (runnable from GDB), the LKH ** kernel module and its include file, and this file (lkm-example.c) ** ** Suggestions {and,or} bug reports are welcomed ! LKH 1.2 already ** in development . ** ** Special thanks to b1nf for quality control ;) ** Shoutout to kraken, keep the good work on psh man ! ** ** Thanks to csp0t (one work to describe you : *elite*) ** and cma4 (EPITECH powa, favorite win32 kernel hax0r) ** ** BigKaas to the devhell crew (r1x and nitrogen fux0r) ** Lightman, Gab and Xfred from chx-labs (stop smoking you junkies ;) ** ** Thanks to the phrackstaff and particulary skyper for his ** great support . Le Havre en force ! Case mais oui je t'aime ;) */ #include "lkh.c" int hijack_me(int a, int b); /* hooked function */ int hijack_zero(void *ptr); /* first callback */ int hijack_one(void *ptr); /* second callback */ int hijack_two(void *ptr); /* third callback */ void hijack_fork(void *ptr); /* sys_fork callback */ void hijack_schedule(void *ptr); /* schedule callback */ static hook_t *h = NULL; static hook_t *i = NULL; static hook_t *j = NULL; int init_module() { int ret; printk(KERN_ALERT "Change the SYS_FORK value then remove the return \n"); return (-1); /* ** Create the hooks */ #define SYS_FORK 0xc010584c j = khook_create(SYS_FORK , HOOK_PERMANENT | HOOK_ENABLED | HOOK_DISCRETE); #undef SYS_FORK h = khook_create(ksym_lookup("hijack_me") , HOOK_PERMANENT | HOOK_ENABLED | HOOK_AGGRESSIVE); i = khook_create(ksym_lookup("schedule") , HOOK_SINGLESHOT | HOOK_ENABLED | HOOK_DISCRETE); /* ** Yet another check */ if (!h || !i || !j) { printk(KERN_ALERT "Cannot hook kernel functions \n"); return (-1); } /* ** Adding some callbacks for the sys_fork and schedule functions */ khook_add_entry(i, (int) hijack_schedule, 0); khook_add_entry(j, (int) hijack_fork, 0); /* ** Testing the hijack_me() hook . */ printk(KERN_ALERT "LKH: perm, aggressive, enabled hook, 3 callbacks:\n"); khook_add_entry(h, (int) hijack_zero, 1); khook_add_entry(h, (int) hijack_one, 0); khook_add_entry(h, (int) hijack_two, 2); ret = hijack_me(0, 1); printk(KERN_ALERT "--------------------\n"); printk(KERN_ALERT "Testing a disabled hook :\n"); khook_set_state(h, HOOK_DISABLED); ret = hijack_me(10, 20); khook_destroy(h); printk(KERN_ALERT "------------------\n"); printk(KERN_ALERT "Calling hijack_me after the hook destruction\n"); hijack_me(1, 2); return (0); } void cleanup_module() { khook_destroy(i); khook_destroy(j); printk(KERN_ALERT "LKH unloaded - sponsorized by the /dev/hell crew!\n"); } /* ** Function to hijack */ int hijack_me(int a, int b) { printk(KERN_ALERT "A in HIJACKME!!! = %u \t -OK- \n", a); printk(KERN_ALERT "B in HIJACKME!!! = %u \t -OK- \n", b); return (42); } /* ** First callback for hijack_me() */ int hijack_zero(void *ptr) { int *a; int *b; a = ptr; b = a + 1; printk(KERN_ALERT "A in hijack_zero = %u \t -OK- \n", *a); printk(KERN_ALERT "B in hijack_zero = %u \t -OK- \n", *b); (*b)++; (*a)++; return (0); } /* ** Second callback for hijack_me() */ int hijack_one(void *ptr) { int *a; int *b; a = ptr; b = a + 1; printk(KERN_ALERT "A in hijack_one = %u \t -OK- \n", *a); printk(KERN_ALERT "B in hijack_one = %u \t -OK- \n", *b); (*a)++; (*b)++; return (1); } /* ** Third callback for hijack_me() */ int hijack_two(void *ptr) { int *a; int *b; a = ptr; b = a + 1; printk(KERN_ALERT "A in hijack_two = %u \t -OK- \n", *a); printk(KERN_ALERT "B in hijack_two = %u \t -OK- \n", *b); (*a)++; (*b)++; return (2); } /* ** Callback for schedule() (kernel exported symbol) */ void hijack_schedule(void *ptr) { printk(KERN_ALERT "SCHEDULING! \n"); } /* ** Callbacks for sys_fork() (kernel non exported symbol) */ void hijack_fork(void *ptr) { printk(KERN_ALERT "FORKING! \n"); } --[ 6 - Âü°í¹®Çå [1] Kernel function hijacking http://www.big.net.au/~silvio/ [2] INTEL Developers manual http://developers.intel.com/design/pentiu m4/manuals/ [3] Linux Kernel Internals http://www.linuxdoc.org/guides.html |=[ EOF ]=---------------------------------------------------------------=|