
ããã«ã¡ã¯ ç§ã®ååã¯ãã«ã³ã§ãBadooã®ã·ã¹ãã ããã°ã©ããŒã§ãã ç¹å®ã®ããšãã©ã®ããã«æ©èœããããå®å
šã«çè§£ãããã®ã§ãLinuxã®å
±æã©ã€ãã©ãªã®åŸ®åŠããäŸå€ã§ã¯ãããŸããã ç§ã¯ããªãã«ãã®ãããªåæã®ç¿»èš³ãæç€ºããŸãã è¯ãèªæžãããŠãã ããã
å
±æã©ã€ãã©ãªãããã»ã¹ã®ã¢ãã¬ã¹ç©ºéã«ããŒãããéã®å
±æã©ã€ãã©ãªã®ç¹å¥ãªåŠçã®å¿
èŠæ§ã«ã€ããŠã¯ãã§ã«èª¬æããŸããã ã€ãŸãããªã³ã«ãå
±æã©ã€ãã©ãªãäœæãããšããã¡ã¢ãªå
ã®ã©ãã«ããŒããããããäºåã«ç¥ããŸããã ãã®ãããã©ã€ãã©ãªå
ã®ããŒã¿ãšã³ãŒããžã®ãªã³ã¯ã«ã¯åé¡ããããŸãããªã³ã¯ãäœæããŠãã©ã€ãã©ãªã®ããŒãåŸã«é©åãªå Žæãæãããã«ããæ¹æ³ã¯äžæã§ãã
Linuxããã³ELFã§ã¯ããã®åé¡ã解決ãã2ã€ã®äž»ãªæ¹æ³ããããŸãã
- ããŒãæã®åé
眮ïŒããŒãæã®åé
眮ïŒã
- ã¢ãã¬ã¹ã«äŸåããªãã³ãŒãïŒäœçœ®ã«äŸåããªãã³ãŒãïŒPICïŒïŒã
ããŒãäžã«åé
çœ®ãæ€èšããŸããã æ¬¡ã«ã2çªç®ã®ã¢ãããŒã-PICãæ€èšããŸãã
æåã¯x86ãšx64ïŒx86-64ãšãåŒã°ããïŒã®äž¡æ¹ã«ã€ããŠè©±ãäºå®ã§ããããèšäºã¯ã©ãã©ãæé·ãç¶ããããå®çšçã«ããå¿
èŠããããšå€æããŸããã ãããã£ãŠããã®èšäºã§ã¯x86ã«ã€ããŠã®ã¿èª¬æããx64ã«ã€ããŠã¯å¥ã®ãã®ã§èª¬æããŸãïŒã¯ããã«çãããšãé¡ã£ãŠããŸãïŒã å€ãx86ã¢ãŒããã¯ãã£ãæ¡çšããŸãããx64ãšã¯ç°ãªããPICã䜿çšããã«èšèšãããŠãããPICã®å®è£
ã¯ããå°ãè€éã§ãã
èµ·åæã®åé
眮ã®åé¡
åã®èšäºã§èŠãããã«ãããŒãæã®åé
眮ã¯éåžžã«ç°¡åã§ç°¡åãªæ¹æ³ã§ãã ãããŠããã¯åäœããŸãã ãã ããçŸæç¹ã§ã¯PICã®æ¹ãã¯ããã«äººæ°ããããå
±æã©ã€ãã©ãªãäœæããæ¹æ³ãšããŠæšå¥šãããŠããŸãã ãªãã§ããïŒ
åé
眮ã«ã¯ããã€ãã®åé¡ããããŸããæéãããããããã¹ãã»ã¯ã·ã§ã³ïŒãã·ã³ã³ãŒããå«ãïŒãããã»ã¹éã®åé¢ã«é©ããŠããŸããã
æåã«ããã©ãŒãã³ã¹ã®åé¡ã«ã€ããŠè©±ããŸãããã ã©ã€ãã©ãªãåé
眮ãå¿
èŠãšããã·ã³ãã«ã«é¢ããæ
å ±ã«ãªã³ã¯ãããŠããå Žåãåé
眮èªäœã¯ããŒãã«æéãããããŸãã ããŒããŒã¯ãœãŒã¹ã³ãŒãå
šäœãå®è¡ããå¿
èŠããªãããããã®æéãé·ããã¹ãã§ã¯ãªããšèãããããããŸããããããã®ã·ã³ãã«ããã ééããã ãã§ãã ããããè€éãªããã°ã©ã ãããã€ãã®å€§ããªã©ã€ãã©ãªãããŒããããšããªãŒããŒããããéåžžã«æ¥éã«èç©ããŸãããã®çµæãããã°ã©ã ã®èµ·åæã«ããªãã®é
å»¶ãçããŸãã
ããŠãããã¹ãã»ã¯ã·ã§ã³ãå
±æã§ããªããšããåé¡ã«ã€ããŠã®ããã€ãã®èšèã 圌女ã¯ããå°ãæ·±å»ã§ãã å
±æã©ã€ãã©ãªãååšããäž»ãªã¿ã¹ã¯ã®1ã€ã¯ãã¡ã¢ãªãç¯çŽããããšã§ãã äžéšã®ã©ã€ãã©ãªã¯ãè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã§åæã«äœ¿çšãããŸãã ããã¹ãã»ã¯ã·ã§ã³ïŒãã·ã³ã³ãŒããé
眮ãããŠããå ŽæïŒãäžåºŠã ãã¡ã¢ãªã«ããŒãïŒããã³mmapã䜿çšããŠä»ã®ããã»ã¹ã«è¿œå ïŒã§ããå Žåãããªã倧éã®RAMãä¿åã§ããŸãã ãã ããåé
眮ã䜿çšããå Žåãããã¯äžå¯èœã§ããç¹å®ã®ããã»ã¹ã®æ£ãããã€ã³ã¿ãŒã«çœ®ãæããã«ã¯ãããŒãæã«ããã¹ãã»ã¯ã·ã§ã³ã倿Žããå¿
èŠãããããã§ãã ã©ã€ãã©ãªã䜿çšããããã»ã¹ããšã«ããã®ã©ã€ãã©ãªã®å®å
šãªã³ããŒãã¡ã¢ãªã«ä¿æããå¿
èŠãããããšãããããŸã[1] ã åé¢ã¯çºçããŸããã
ããã«ãããã¹ãã»ã¯ã·ã§ã³ãæžãèŸŒã¿æš©éã§ä¿æããïŒããã³ããŒããŒããªã³ã¯ãä¿®æ£ã§ããããã«æžãèŸŒã¿æš©éã䜿çšããå¿
èŠããããŸãïŒããšã¯ãã»ãã¥ãªãã£ã®èгç¹ããã¯æªãããšã§ãã ãã®å Žåããšã¯ã¹ããã€ããäœæããã®ã¯ã¯ããã«ç°¡åã§ãã
åŸã§èŠãããã«ãPICã¯ãããã®åé¡ãã»ãŒå®å
šã«è§£æ±ºããŸãã
ã¯ããã«
PICã®èåŸã«ããèãæ¹ã¯éåžžã«åçŽã§ã-ã°ããŒãã«ãªããžã§ã¯ãããã³é¢æ°ãžã®ãã¹ãŠã®åç
§ã®ã³ãŒãã«äžéå±€ã远å ããŸãã ãªã³ã¯ããã³ããŒãããã»ã¹ã®ã¢ãŒãã£ãã¡ã¯ããã€ã³ããªãžã§ã³ãã«äœ¿çšããå Žåãããã¹ãã»ã¯ã·ã§ã³ãé
眮å
ã®ã¢ãã¬ã¹ããå®éã«ç¬ç«ãããããšãã§ããŸãã mmapã䜿çšããŠã»ã°ã¡ã³ããããã»ã¹ã®ã¢ãã¬ã¹ç©ºéå
ã®ããŸããŸãªã¢ãã¬ã¹ã«ãããã³ã°ã§ããŸãããã®äžã®1ãããã倿Žããå¿
èŠã¯ãããŸããã æ¬¡ã®ããã€ãã®ã»ã¯ã·ã§ã³ã§ã¯ããããå®çŸããæ¹æ³ã瀺ããŸãã
äž»ãªã¢ã€ãã¢çªå·1ã ããã¹ãã»ã¯ã·ã§ã³ãšããŒã¿ã»ã¯ã·ã§ã³éã®ãªãã»ãã
PICãåºã«ããŠããéèŠãªã¢ã€ãã¢ã®1ã€ã¯ãããã¹ãã»ã¯ã·ã§ã³ãšããŒã¿ã»ã¯ã·ã§ã³éã®ãªãã»ããã§ãããã®ãµã€ãºã¯ããªã³ã¯æã«ãªã³ã«ãŒã«èªèãããŸãã ãªã³ã«ãè€æ°ã®ãªããžã§ã¯ããã¡ã€ã«ãçµåãããšããããã®ã»ã¯ã·ã§ã³ãäžç·ã«åéãããŸãïŒããšãã°ããã¹ãŠã®ããã¹ãã»ã¯ã·ã§ã³ã1ã€ã®å€§ããªããã¹ãã»ã¯ã·ã§ã³ã«çµåãããŸãïŒã ãããã£ãŠããªã³ã«ã¯ã»ã¯ã·ã§ã³ã®ãµã€ãºãšãããã®çžå¯Ÿäœçœ®ã®äž¡æ¹ãç¥ã£ãŠããŸãã
ããšãã°ãããã¹ãã»ã¯ã·ã§ã³ã®çŽåŸã«ããŒã¿ã»ã¯ã·ã§ã³ãç¶ãå Žåãããããã®å Žåãããã¹ãã»ã¯ã·ã§ã³ããããŒã¿ã»ã¯ã·ã§ã³ã®å
é ãŸã§ã®ä»»æã®åœä»€ããã®ãªãã»ããã¯ãããã¹ãã»ã¯ã·ã§ã³ã®ãµã€ãºããããã¹ãã»ã¯ã·ã§ã³ã®å
é ãããã®åœä»€ãŸã§ã®ãªãã»ãããåŒãããã®ã«çãããªããŸãã ãããŠããããã®å¯žæ³ãšå€äœã¯ãã¹ãŠãªã³ã«ã«èªèãããŠããŸãã

äžèšã®å³ã§ã¯ãã³ãŒãã»ã¯ã·ã§ã³ã¯ããã¢ãã¬ã¹ïŒãªã³ã¯ã®æç¹ã§ã¯äžæïŒ0xXXXX0000ïŒXã¯æåéãããšã«ããããæå³ããŸãïŒã«ããŒããããããŒã¿ã»ã¯ã·ã§ã³ã¯ãã®çŽåŸã«0xXXXXF000ã«ããŒããããŸããã ãã®å Žåãã³ãŒãã»ã¯ã·ã§ã³ã®ãªãã»ãã0x80ã®åœä»€ãããŒã¿ã»ã¯ã·ã§ã³ã®äœãããã€ã³ãããå Žåããªã³ã«ãŒã¯çžå¯Ÿãªãã»ããïŒãã®å Žåã¯0xEF80ïŒãèªèãããããåœä»€ã«è¿œå ã§ããŸãã
ä»ã®ã»ã¯ã·ã§ã³ãã³ãŒãã»ã¯ã·ã§ã³ãšããŒã¿ã»ã¯ã·ã§ã³ã®éã«ãããã³ã°ãããŠããå ŽåããŸãã¯ããŒã¿ã»ã¯ã·ã§ã³ãã³ãŒãã»ã¯ã·ã§ã³ã®åã«ããå Žåãäœã倿Žãããªãããšã«æ³šæããŠãã ããã ãªã³ã«ã¯ãã¹ãŠã®ã»ã¯ã·ã§ã³ã®ãµã€ãºãèªèããããããé
眮ããå Žæã決å®ãããããã¢ã€ãã¢ã¯å€ãããŸããã
äž»èŠãªã¢ã€ãã¢çªå·2ã x86ã§IPãªãã»ãããæ©èœããã
çžå¯Ÿå€äœã䜿çšã§ããå Žåã¯ãäžèšã®ãã¹ãŠãæ©èœããŸãã çµå±ã®ãšãããx86äžã®ããŒã¿ãžã®åç
§ïŒããšãã°ãMOVåœä»€ãªã©ïŒã«ã¯çµ¶å¯Ÿã¢ãã¬ã¹ãå¿
èŠã§ãã ããã§ãç§ãã¡ã¯äœãããŸããïŒ
çžå¯Ÿã¢ãã¬ã¹ã¯ãããã絶察ã¢ãã¬ã¹ãå¿
èŠãªå Žåãåœä»€ãã€ã³ã¿ãŒãŸãã¯åœä»€ã«ãŠã³ã¿ãŒïŒIPïŒã®å€ãæ¬ èœããŠããŸãã å®éãå®çŸ©äžãçžå¯Ÿã¢ãã¬ã¹ã¯IPã«å¯ŸããŠçžå¯Ÿçã§ãã x86ã§ã¯ãIPãååŸããããã®æç€ºã¯ãããŸããããç°¡åãªããªãã¯ã䜿çšã§ããŸãã 以äžã«ãããã瀺ãå°ããªã¢ã»ã³ãã©ãŒã®æ¬äŒŒã³ãŒãã瀺ããŸãã
call TMPLABEL TMPLABEL: pop ebx
ããã§äœãèµ·ãã£ãŠããŸããïŒ
- ããã»ããµã¯åŒã³åºãåœä»€TMPLABELãå®è¡ããŸããããã¯ã¹ã¿ãã¯äžã®æ¬¡ã®åœä»€ã®ã¢ãã¬ã¹ïŒpop ebxïŒãæ ŒçŽããã©ãã«ã«ãžã£ã³ãããŸãã
- ã©ãã«ã®åœä»€ã¯pop ebxã§ãããããæ¬¡ã®ããã«å®è¡ãããŸãã ãã®åœä»€ã¯ãebxã®ã¹ã¿ãã¯ããå€ãååŸããŸãã ããããããã¯åœä»€èªäœã®ã¢ãã¬ã¹ã§ãã ãã®ãããå®éãebxã«ã¯IPå€ãå«ãŸããŠããŸãã
ã°ããŒãã«ãªãã»ããããŒãã«ïŒGOTïŒ
ããã§ãx86ã¢ãã¬ã¹ã«äŸåããªãã¢ãã¬ã¹æå®ãã©ã®ããã«å®è£
ããããã«ã€ããŠæçµçã«èª¬æãããã¹ãŠãã§ããŸããã ãŸããã°ããŒãã«ãªãã»ããããŒãã«ïŒã°ããŒãã«ãªãã»ããããŒãã«ãŸãã¯GOTïŒã䜿çšããŠå®è£
ãããŸãã
GOTã¯ãã¢ãã¬ã¹ãããŒã¿ã»ã¯ã·ã§ã³ã«ããåãªãããŒãã«ã§ãã ã³ãŒãã»ã¯ã·ã§ã³ã®äžéšã®åœä»€ã倿°ã«ã¢ã¯ã»ã¹ããããšããŸãã 絶察ã¢ãã¬ã¹ïŒåé
眮ãå¿
èŠïŒãä»ããŠã¢ã¯ã»ã¹ãã代ããã«ãGOTã®ãšã³ããªãåç
§ããŸãã GOTã®ââããŒã¿ã»ã¯ã·ã§ã³ã«ã¯å³å¯ã«å®çŸ©ãããå Žæãããããªã³ã«ãŒã¯ãããèªèããŠããããããã®åŒã³åºããçžå¯Ÿçã§ãã ãããŠãGOTã®ãšã³ããªã«ã¯æ¢ã«å€æ°ã®çµ¶å¯Ÿã¢ãã¬ã¹ãå«ãŸããŠããŸãã

ç䌌ã¢ã»ã³ãã©ãŒã§ã¯ãããã¯çµ¶å¯Ÿã¢ãã¬ã¹æå®ã®çœ®ãæãã®ããã«èŠããŸãã
ã¬ãžã¹ã¿ãšå°ããªããããä»ããŠã¢ãã¬ã¹æå®ããå ŽåïŒ
ã©ããããããGOTã¢ãã¬ã¹ãèŠã€ããŠebxã«å
¥ããŸãïŒ
lea ebxãADDR_OF_GOT
倿°ã¢ãã¬ã¹ïŒADDR_OF_VARïŒãGOTã®ãªãã»ãã0x10ã«ãããšããŸãã ãã®å Žåãæ¬¡ã®ã¹ããŒãã¡ã³ãã¯ADDR_OF_VARãedxã«å
¥ããŸãã
mov edxãDWORD PTR [ebx + 0x10]
æåŸã«ã倿°ã«æ»ãããã®å€ãedxã«å
¥ããŸãã
mov edxãDWORD PTR [edx]
ãããã£ãŠãGOTãä»ããŠåŒã³åºãããªãã€ã¬ã¯ãããããšã«ãããã³ãŒãã»ã¯ã·ã§ã³ã®åé
眮ãåãé€ããŸããã ãã ããããŒã¿ã»ã¯ã·ã§ã³ã«åé
眮ãäœæããŸããã ãªãã§ïŒ GOTã«ã¯ãäžèšã®ã¹ããŒã ãæ©èœããããã®å€æ°ã®çµ¶å¯Ÿã¢ãã¬ã¹ãå«ãŸããŠããå¿
èŠãããããã§ãã ããã§ãå©çã¯ã©ãã«ãããŸããïŒ
ããããã®å©çããããŸãã ããŒã¿ã»ã¯ã·ã§ã³ã§ã®åé
眮ã¯ãã³ãŒãã»ã¯ã·ã§ã³ã§ã®åé
眮ãããã¯ããã«å°ãªãæ°ã®åé¡ã«é¢é£ããŠããŸãã ããã«ã¯ãããŒãæã®åé
眮äžã«çºçãã2ã€ã®åé¡ã«å¯Ÿå¿ãã2ã€ã®çç±ããããŸãã
- ã³ãŒãã»ã¯ã·ã§ã³ã®åé
眮ã¯å€æ°ã®åŒã³åºãããšã«å¿
èŠã§ãããGOTã®åé
眮ã¯ãã¹ãŠã®å€æ°ã«ã®ã¿å¿
èŠã§ãã éåžžã倿°ãžã®ã¢ã¯ã»ã¹ã¯å€æ°ãããé¡èã«å€ããããããå¹ççã§ãã
- ããŒã¿ã»ã¯ã·ã§ã³ã¯ãã§ã«æžã蟌ã¿å¯èœã§ãããããã»ã¹éã§å
±æãããŠããªãããããã®äžã®åé
眮ã¯åé¡ãããŸããã ããããã³ãŒãã»ã¯ã·ã§ã³ã«åé
眮ããªããªããšããäºå®ã«ããããã®ã»ã¯ã·ã§ã³ãèªã¿åãå°çšã«ããããã»ã¹éã§å
±æããããšãã§ããŸãã
GOTãä»ããåŒã³åºãã®ããPICïŒäŸïŒ
次ã«ãPICã®ä»çµã¿ãç€ºãæ¬æ ŒçãªäŸã瀺ããŸãã
int myglob = 42; int ml_func(int a, int b) { return myglob + a + b; }
ãã®ã³ãŒããããã¯ã¯ãïŒ-fpicããã³-sharedãã©ã°ã䜿çšããŠïŒå
±æã©ã€ãã©ãªã«ã³ã³ãã€ã«ãããŸãlibmlpic_dataonly.soã
ml_func颿°ã«æ³šç®ããŠãã³ã³ãã€ã©ãŒãçæãããã®ãèŠãŠã¿ãŸãããã
0000043c <ml_func>: 43c: 55 push ebp 43d: 89 e5 mov ebp,esp 43f: e8 16 00 00 00 call 45a <__i686.get_pc_thunk.cx> 444: 81 c1 b0 1b 00 00 add ecx,0x1bb0 44a: 8b 81 f0 ff ff ff mov eax,DWORD PTR [ecx-0x10] 450: 8b 00 mov eax,DWORD PTR [eax] 452: 03 45 08 add eax,DWORD PTR [ebp+0x8] 455: 03 45 0c add eax,DWORD PTR [ebp+0xc] 458: 5d pop ebp 459: c3 ret 0000045a <__i686.get_pc_thunk.cx>: 45a: 8b 0c 24 mov ecx,DWORD PTR [esp] 45d: c3 ret
åœä»€ã®ã¢ãã¬ã¹ïŒåºåã®å·Šç«¯ã®çªå·ïŒããã€ã³ãããŸãã ãã®ã¢ãã¬ã¹ã¯ãã©ã€ãã©ãªãããããããã¢ãã¬ã¹ããã®ãªãã»ããã§ãã
- 43fã§ã次ã®åœä»€ã®ã¢ãã¬ã¹ããããŒã¢ã€ãã¢No. 2ãã®ã»ã¯ã·ã§ã³ã§åè¿°ããã®ãšåãæ¹æ³ã§ecxã«é
眮ãããŸãã
- 444ã§ã¯ãåœä»€ããGOTãžã®æ¢ç¥ã®ãªãã»ãããecxã«é
眮ãããŸãã ãããã£ãŠãecxã¯GOTãžã®ãã€ã³ã¿ãšããŠæ©èœããããã«ãªããŸããã
- 44aã§ãGOTããã®ã¬ã³ãŒãã§ãã[ecx-0x10]ã®å€ãååŸãããeaxã«å
¥ããããŸãã ããã¯ãmyglob倿°ã®ã¢ãã¬ã¹ã§ãã
- 450ã§ã¯ããã§ã«myglobãååŸããŠeaxã«å
¥ããŠããŸãã
- 次ã«ããã©ã¡ãŒã¿ãŒaãšbãmyglobã«è¿œå ãããå€ãè¿ãããŸãïŒãããã£ãŠãeaxã«æ®ããŸãïŒã
readelf -Sã䜿çšããŠããªã³ã«ãGOTãé
眮ããå ŽæãèŠã€ããããšãã§ããŸãã
Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al <snip> [19] .got PROGBITS 00001fe4 000fe4 000010 04 WA 0 0 4 [20] .got.plt PROGBITS 00001ff4 000ff4 000014 04 WA 0 0 4 <snip>
èšç®æ©ãå
¥æããŠãã³ã³ãã€ã©ã確èªããŸãããã myglobãæ¢ããŠããŸãã åè¿°ããããã«ã__ i686.get_pc_thunk.cxãåŒã³åºããšãecxã«æ¬¡ã®åœä»€ã®ã¢ãã¬ã¹ãèšå®ãããŸãã ããã¯0x444 [2]ã§ãã æ¬¡ã®åœä»€ã¯ãããã«0x1bb0ã远å ããŸã-ãã®çµæãecxã§0x1ff4ãååŸããŸãã æåŸã«ãmyglobã¢ãã¬ã¹ãå«ãGOTèŠçŽ ãååŸããã«ã¯ã[ecx-0x10]ãå®è¡ããŸãã ãããã£ãŠããã®èŠçŽ ã¯ã¢ãã¬ã¹0x1fe4ãæã¡ãããã¯ã»ã¯ã·ã§ã³ããããŒã«ãããšGOTã®æåã®èŠçŽ ã§ãã
ååã.gotã§å§ãŸãå¥ã®ã»ã¯ã·ã§ã³ãããçç±ã¯ãåŸã§èª¬æããŸã[3] ã ã³ã³ãã€ã©ãŒã¯ãGOTã®åŸã«ecxã¢ãã¬ã¹ãé
眮ããè² ã®ãªãã»ããã䜿çšããããšã«ããããšã«æ³šæããŠãã ããã æçµçã«ãã¹ãŠãåæããŠã倧äžå€«ã§ãã ãããŠãããŸã§ã®ãšããããã¹ãŠãåæããŠããŸãã
ãããããŸã äžè¶³ããŠããããšã1ã€ãããŸãã myglobã¢ãã¬ã¹ã¯ã0x1fe4ã®GOTèŠçŽ ã«ã©ã®ãããæ£ç¢ºã«è¡šç€ºãããŸããïŒ ç§ãåé
眮ã«èšåããããšãæãåºããŠãã ãããããã§ãããèŠã€ããŸãããïŒ
> readelf -r libmlpic_dataonly.so Relocation section '.rel.dyn' at offset 0x2dc contains 5 entries: Offset Info Type Sym.Value Sym. Name 00002008 00000008 R_386_RELATIVE 00001fe4 00000406 R_386_GLOB_DAT 0000200c myglob <snip>
ããã§ã¯ãäºæ³ã©ãããã¢ãã¬ã¹0x1fe4ãæãmyglobã®åé
眮ã§ãã åé
眮ã®ã¿ã€ãã¯R_386_GLOB_DATã§ãããåã«ããŒããŒã«ããã®ãªãã»ããã§simpolã®å®éã®å€ïŒã€ãŸãããã®ã¢ãã¬ã¹ïŒãå
¥åãããããšãäŒããŸãã ããã§ãã¹ãŠãæç¢ºã«ãªããŸããã ã©ã€ãã©ãªãããŒããããšãã«ããã¹ãŠãã©ã®ããã«èŠãããã確èªããããã ãã«æ®ããŸãã ãããè¡ãã«ã¯ãlibmlpic_dataonly.soã«ãªã³ã¯ããŠml_funcãåŒã³åºããgdbã§å®è¡ããåçŽãªãã©ã€ããŒïŒãã€ããªïŒãäœæããŸãã
> gdb driver [...] skipping output (gdb) set environment LD_LIBRARY_PATH=. (gdb) break ml_func [...] (gdb) run Starting program: [...]pic_tests/driver Breakpoint 1, ml_func (a=1, b=1) at ml_reloc_dataonly.c:5 5 return myglob + a + b; (gdb) set disassembly-flavor intel (gdb) disas ml_func Dump of assembler code for function ml_func: 0x0013143c <+0>: push ebp 0x0013143d <+1>: mov ebp,esp 0x0013143f <+3>: call 0x13145a <__i686.get_pc_thunk.cx> 0x00131444 <+8>: add ecx,0x1bb0 => 0x0013144a <+14>: mov eax,DWORD PTR [ecx-0x10] 0x00131450 <+20>: mov eax,DWORD PTR [eax] 0x00131452 <+22>: add eax,DWORD PTR [ebp+0x8] 0x00131455 <+25>: add eax,DWORD PTR [ebp+0xc] 0x00131458 <+28>: pop ebp 0x00131459 <+29>: ret End of assembler dump. (gdb) i registers eax 0x1 1 ecx 0x132ff4 1257460 [...] skipping output
ãããã¬ãŒã¯ml_funcã«å
¥ããIP 0x0013144a [4]ã§åæ¢ããŸããã ecxã®å€ã¯0x132ff4ïŒåœä»€ã¢ãã¬ã¹ãš0x1bb0ïŒã§ããããšãããããŸãã çŸæç¹ã§ã¯ãæäœäžããããã¯ãã¹ãŠçµ¶å¯Ÿã¢ãã¬ã¹ã§ããããšã«æ³šæããŠãã ãã-ã©ã€ãã©ãªã¯ãã§ã«ããã»ã¹ã®ã¢ãã¬ã¹ç©ºéã«ããŒããããŠããŸãã
ãã®ãããmyglobãå«ãGOTèŠçŽ ã¯[ecx-0x10]ã«ããã¯ãã§ãã 確èªããŸãããïŒ
(gdb) x 0x132fe4 0x132fe4: 0x0013300c
ã€ãŸãã0x0013300cãmyglobã®ã¢ãã¬ã¹ã§ãããšäºæ³ãããŸãã ç§ãã¡ã¯ãã§ãã¯ããŸãïŒ
(gdb) p &myglob $1 = (int *) 0x13300c
ããã§ãïŒ
PICã§é¢æ°ãåŒã³åºã
ããã§ãPICãããŒã¿ã¢ãã¬ã¹ã«å¯ŸããŠã©ã®ããã«æ©èœããããèŠãŸããã ãããã颿°ã¯ã©ãã§ããïŒ çè«çã«ã¯ãåãæ¹æ³ã§é¢æ°ãæ©èœããŸãã 颿°ã®ã¢ãã¬ã¹ãå«ãåŒã³åºãã®ä»£ããã«ãGOTããã®èŠçŽ ã®ã¢ãã¬ã¹ãå«ãããã«ããŸãããããããšãèŠçŽ ã¯ããŒãæã«ãã§ã«å
¥åãããŠããŸãã
ããããPICã§é¢æ°ãåŒã³åºããŠããã®ããã«ã¯åäœããŸãããå®éã«ã¯ããã¹ãŠãå€å°è€éã§ãã æ¹æ³ãæ£ç¢ºã«èª¬æããåã«ããã®ãããªã¡ã«ããºã ãéžæããåæ©ã«ã€ããŠç°¡åã«èª¬æããŸãã
æé©åïŒé
å»¶ãã€ã³ãã£ã³ã°
å
±æã©ã€ãã©ãªã颿°ã䜿çšããå Žåããã®é¢æ°ã®å®éã®ã¢ãã¬ã¹ã¯ãŸã äžæã§ãã å®éã®ã¢ãã¬ã¹ã®å®çŸ©ã¯ãã€ã³ãã£ã³ã°ãšåŒã°ããŸããããã¯ãããŒããŒãå
±æã©ã€ãã©ãªãããã»ã¹ã®ã¢ãã¬ã¹ç©ºéã«ããŒããããšãã«è¡ãããšã§ãã ããŒããŒã¯ç¹å¥ãªããŒãã«[5]ã§é¢æ°ã·ã³ãã«ãæ¢ãå¿
èŠãããããããã€ã³ãã£ã³ã°ã¯ç°¡åã§ã¯ãããŸããã
ãããã£ãŠãå颿°ã®å®éã®ã¢ãã¬ã¹ã®æ±ºå®ã«ã¯æéãããããŸãïŒããã»ã©æéã¯ããããŸããããããŒã¿ããã颿°ã®åŒã³åºããã¯ããã«å€ãããããã®ããã»ã¹ã®æéã¯é·ããªããŸãïŒã ããã«ãã»ãšãã©ã®å Žåãããã¯ç¡é§ã«è¡ãããŸããããã¯ãéåžžã®ããã°ã©ã ã®èµ·åäžã«ã颿°ã®ããäžéšããåŒã³åºãããªãããã§ãïŒãšã©ãŒãŸãã¯ç¹å¥ãªæ¡ä»¶ãçºçããå Žåã«ã®ã¿å¿
èŠãªåŒã³åºãã®æ°ãèããŠãã ããïŒã
ãã®ããã»ã¹ãé«éåããããã«ããé
å»¶ããã€ã³ãã£ã³ã°ã®bindingãªã¹ããŒã ãèæ¡ãããŸããã ãé
å»¶ãã¯ãITã®æé©åã®äžè¬çãªçšèªã§ãããäœæ¥ãæåŸã®æåŸãŸã§å»¶æãããå Žåã§ãã ãã®æé©åã®ãã€ã³ãã¯ãäžå¿
èŠãªäœæ¥ãè¡ãããšã§ã¯ãããŸããã ãã®ãããªé
å»¶æé©åã®äŸã¯ãã³ããŒãªã³ã©ã€ãã¡ã«ããºã ãšé
å»¶èšç®ã§ãã
ãé
å»¶ãã¹ããŒã ã¯ãå¥ã®ã¬ãã«ã®ã¢ãã¬ã¹æå®-PLTã远å ããããšã§å®è£
ãããŸãã
ããã·ãŒãžã£ãªã³ã±ãŒãžããŒãã«ïŒPLTïŒ
PLTã¯ãäžé£ã®èŠçŽ ïŒã©ã€ãã©ãªãåŒã³åºãå€éšé¢æ°ããšã«1ã€ã®èŠçŽ ïŒã§æ§æããããã€ããªã®ããã¹ãã»ã¯ã·ã§ã³ã®äžéšã§ãã PLTã®åèŠçŽ ã¯ãå®è¡å¯èœãªãã·ã³ã³ãŒãã®å°ããªæçã§ãã 颿°ãåŒã³åºã代ããã«ãPLTããã³ãŒãã®äžéšãçŽæ¥åŒã³åºãããŸãããã®ã³ãŒãã¯æ¢ã«é¢æ°èªäœãåŒã³åºããŠããŸãã ãã®ã¢ãããŒãã¯ããã°ãã°ãã¹ããªã³ã°ããŒãããšåŒã°ããŸãã PLTã®åèŠçŽ ã«ã¯ãGOTã«ç¬èªã®èŠçŽ ãããã颿°ã®å®éã®ãªãã»ãããå«ãŸããŠããŸãã ãã¡ãããããŒããŒããããæ€åºããåŸã
äžèŠããã¹ãŠããããããã§ãããããã«ãã¹ãŠãããæç¢ºã«ãªãããšãé¡ã£ãŠããŸããæ¬¡ã®ã»ã¯ã·ã§ã³ã§ã¯ã詳现ãå³ã§èª¬æããŸãã
ãã§ã«è¿°ã¹ãããã«ãPLTã䜿çšãããšã颿°ã¢ãã¬ã¹ã®ãé
å»¶ãå®çŸ©ãäœæã§ããŸãã å
±æã©ã€ãã©ãªãæåã«ããŒããããæç¹ã§ã¯ã颿°ã®å®éã®ã¢ãã¬ã¹ã¯ãŸã å®çŸ©ãããŠããŸããã

解説
- func颿°ã¯ã³ãŒãå
ã§åŒã³åºãããŸãã ã³ã³ãã€ã©ã¯ããã®åŒã³åºããfunc @ pltåŒã³åºãã«å€æããŸããããã¯PLTã®èŠçŽ ã®1ã€ã§ãã
- PLTã¯ç¹å¥ãªæåã®èŠçŽ ã§æ§æããããã®åŸã«æ©èœããšã«1ã€ã®æ§é åãããããã€ãã®èŠçŽ ãç¶ããŸãã
- æåã®èŠçŽ ãé€ããã¹ãŠã®PLTèŠçŽ ã«ã¯ã次ã®éšåãå«ãŸããŸãã
â¢GOTãã察å¿ããèŠçŽ ã«ç€ºãããŠããã¢ãã¬ã¹ã«ãžã£ã³ãããŸãã
â¢ã決å®ãã®æ¹æ³ã«é¢ããè°è«ã®æºåã
â¢æåã®PLTèŠçŽ ã«ãããå®çŸ©ãã¡ãœããã®åŒã³åºãã - PLTã®æåã®èŠçŽ ã¯ãããŒããŒèªäœã®ã³ãŒãã«ãããå®çŸ©ãã¡ãœããã®åŒã³åºãã§ã[6] ã ãã®ã¡ãœããã¯é¢æ°ã®å®éã®ã¢ãã¬ã¹ã決å®ããŸãïŒããã«ã€ããŠã¯ä»¥äžã§è©³ãã説æããŸãïŒã
- 颿°ã®å®éã®ã¢ãã¬ã¹ã決å®ãããåã«ãNçªç®ã®GOTèŠçŽ ã¯åã«ãžã£ã³ãåŸã®ã¢ãã¬ã¹ãæããŸãã ãããããã€ã¢ã°ã©ã äžã®ç¢å°ãç°ãªãè²ã§åŒ·èª¿è¡šç€ºãããŠããçç±ã§ã-ããã¯å®éã®ãžã£ã³ãã§ã¯ãªããåãªããã€ã³ã¿ã§ãã
funcãåããŠåŒã³åºãããåŸã«äœãèµ·ãããïŒ
- PLT [n]ãåŒã³åºãããGOT [n]ããã¢ãã¬ã¹ãžã®ãžã£ã³ããçºçããŸãã
- ãã®ã¢ãã¬ã¹ã¯ããå®çŸ©ãã¡ãœããã®åŒæ°ã®æºåãè¡ãããå Žæã§ããPLT [n]ãæããŠããŸãã
- ã¡ãœãããåŒã³åºãããŸãã
- ã¡ãœããã¯func颿°ã®å®éã®ã¢ãã¬ã¹ã決å®ãããããGOT [n]ã«å
¥ããŠfuncãåŒã³åºããŸãã
åå以éããã£ãŒãã¯å°ãç°ãªããŸãã

GOT [n]ã¯PLTãæãã®ã§ã¯ãªããå®éã®func [7]ãæãããã«ãªããŸããã ãã®ããã颿°ãåã³åŒã³åºããããšã次ã®ããšãèµ·ãããŸãã
- PLT [n]ãåŒã³åºãããGOT [n]ããã¢ãã¬ã¹ãžã®ãžã£ã³ããçºçããŸãã
- GOT [n]ã¯funcãæããŠãããããfuncã¯åã«åŒã³åºãããŸãã
èšãæãããšããå®çŸ©ãã¡ãœããã䜿çšããã«ãäœåãªãžã£ã³ããããã«funcãåŒã³åºãã ãã§ãã ãã®ã¡ã«ããºã ã«ããã颿°ã¢ãã¬ã¹ã®ãé
å»¶ãå®çŸ©ãäœæã§ããåŒã³åºãããªã颿°ã®å®çŸ©ã¯äœæã§ããŸããã
ã©ã€ãã©ãªã¯çµ¶å¯Ÿã¢ãã¬ã¹ã䜿çšãããå¯äžã®å Žæã¯GOTã§ãããããŒã¿ã»ã¯ã·ã§ã³ã«ãããããŒããŒã«ããããŒãäžã«åé
眮ããããããã©ã€ãã©ãªã¯ããŠã³ããŒãå
ã®ã¢ãã¬ã¹ããå®å
šã«ç¬ç«ããŠããããšã«æ³šæããŠãã ããã PLTã§ãããŒãã¢ãã¬ã¹ã«äŸåããªããããèªã¿åãå°çšã®ããã¹ãã»ã¯ã·ã§ã³ã«å«ããããšãã§ããŸãã
ãæ±ºå®ãã®æ¹æ³ã®è©³çްã«ã¯è§ŠããŸããããããã¯ããã»ã©éèŠã§ã¯ãããŸããã ã¡ãœããã¯ãããŒãããŒããŒå
ã®äœã¬ãã«ã®ã³ãŒãã®äžéšã§ããããã®åœ¹å²ãæãããŸãã ã¡ãœãããåŒã³åºãããåã«æºåãããåŒæ°ã¯ã颿°ã®ã¢ãã¬ã¹ã決å®ããå¿
èŠããããçµæãé
眮ããå Žæãç¥ãããŸãã
PLTããã³GOTãä»ãã颿°åŒã³åºãã䜿çšããPICïŒäŸïŒ
ããŠãå®è·µã§çè«ã匷åããããã«ãäžèšã®æ¹æ³ã䜿çšããŠé¢æ°åŒã³åºãã瀺ãäŸãèããŠã¿ãŸãããã
å
±æã©ã€ãã©ãªã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
int myglob = 42; int ml_util_func(int a) { return a + 1; } int ml_func(int a, int b) { int c = b + ml_util_func(a); myglob += c; return b + myglob; }
ãã®ã³ãŒãã¯libmlpic.soã«ã³ã³ãã€ã«ãããml_funcããml_util_funcãåŒã³åºãããšã«çŠç¹ãåãããŸãã ml_funcãéã¢ã»ã³ãã«ããŸãã
00000477 <ml_func>: 477: 55 push ebp 478: 89 e5 mov ebp,esp 47a: 53 push ebx 47b: 83 ec 24 sub esp,0x24 47e: e8 e4 ff ff ff call 467 <__i686.get_pc_thunk.bx> 483: 81 c3 71 1b 00 00 add ebx,0x1b71 489: 8b 45 08 mov eax,DWORD PTR [ebp+0x8] 48c: 89 04 24 mov DWORD PTR [esp],eax 48f: e8 0c ff ff ff call 3a0 <ml_util_func@plt> <... snip more code>
è峿·±ãã®ã¯ãml_util_func @ pltãåŒã³åºãããšã§ãã ãŸããGOTã¢ãã¬ã¹ãebxã«ããããšã«æ³šæããŠãã ããã ml_util_func @ pltã¯æ¬¡ã®ããã«ãªããŸãïŒå®è¡æš©éã®ãã.pltã»ã¯ã·ã§ã³ã«ãããŸãïŒã
000003a0 <ml_util_func@plt>: 3a0: ff a3 14 00 00 00 jmp DWORD PTR [ebx+0x14] 3a6: 68 10 00 00 00 push 0x10 3ab: e9 c0 ff ff ff jmp 370 <_init+0x30>
åPLTèŠçŽ ã¯3ã€ã®éšåã§æ§æãããŠããããšãæãåºããŠãã ããã
- GOTããã¢ãã¬ã¹ã«ãžã£ã³ãããŸãïŒããã¯[ebx + 0x14]ãžã®ãžã£ã³ãã§ãïŒã
- ãå®çŸ©ãã¡ãœããã®åŒæ°ã®æºåã
- ãå®çŸ©ãã¡ãœããã®åŒã³åºãã
ãå®çŸ©ãã¡ãœããïŒPLTã®èŠçŽ 0ïŒã¯0x370ã«ãããŸãããä»ã¯èå³ããããŸããã GOTã«äœãå«ãŸããŠããããèŠãã®ã¯éåžžã«è峿·±ãã§ãã ãããè¡ãã«ã¯ãåã³é»åãå¿
èŠã§ãã
ml_funcã§çŸåšã®IPãååŸããããªãã¯ã¯0x483ã§è¡ããã0x1b71ã远å ããŸããã ãããã£ãŠãGOTã¯0x1ff4ã«ãããŸãã readelf [8]ã䜿çšãããšãäœããããããããŸãã
> readelf -x .got.plt libmlpic.so Hex dump of section '.got.plt': 0x00001ff4 241f0000 00000000 00000000 86030000 $............... 0x00002004 96030000 a6030000 ........
ml_util_func @ pltã®GOTãšã³ããªã¯ããªãã»ãã+ 0x14ãŸãã¯0x2008ã«ããããã§ãã äžèšã®çµè«ãã倿ãããšããã®ã¢ãã¬ã¹ã®ã¯ãŒãã®å€ã¯0x3a6ã§ãããããã¯ml_util_func @ pltã®ããã·ã¥åœä»€ã®ã¢ãã¬ã¹ã§ãã
ããŒãããŒããŒã®ä»äºãæ¯æŽããããã«ãã¢ãã¬ã¹ml_util_funcãæžã蟌ãŸããGOTã®å Žæã®ã¢ãã¬ã¹ãå«ããšã³ããªãGOTã«è¿œå ãããŸããã
> readelf -r libmlpic.so [...] snip output Relocation section '.rel.plt' at offset 0x328 contains 3 entries: Offset Info Type Sym.Value Sym. Name 00002000 00000107 R_386_JUMP_SLOT 00000000 __cxa_finalize 00002004 00000207 R_386_JUMP_SLOT 00000000 __gmon_start__ 00002008 00000707 R_386_JUMP_SLOT 0000046c ml_util_func
æåŸã®è¡ã¯ãããŒããŒãml_util_funcã·ã³ãã«ã®ã¢ãã¬ã¹ã0x2008ã«é
眮ããå¿
èŠãããããšãæå³ããŠããŸãïŒããããã®é¢æ°ã®GOTèŠçŽ ã§ãïŒã
ãã®å€æŽãGOTã§ã©ã®ããã«è¡ããããã確èªã§ãããããããã§ãã ãããè¡ãã«ã¯ãGDBãå床䜿çšããŸãã
> gdb driver [...] skipping output (gdb) set environment LD_LIBRARY_PATH=. (gdb) break ml_func Breakpoint 1 at 0x80483c0 (gdb) run Starting program: /pic_tests/driver Breakpoint 1, ml_func (a=1, b=1) at ml_main.c:10 10 int c = b + ml_util_func(a); (gdb)
ããã§ãml_util_funcã®æåã®åŒã³åºãã®åã«ããŸãã GOTã¢ãã¬ã¹ã¯ebxã«ããããšãæãåºããŠãã ããã äœããããèŠãŠã¿ãŸãããïŒ
(gdb) i registers ebx ebx 0x132ff4
å¿
èŠãªèŠçŽ ã®ãªãã»ããã¯[ebx + 0x14]ã«ãããŸãã
(gdb) x/w 0x133008 0x133008: 0x001313a6
ã¯ãã0x3a6ã§çµäºããŸãã ããã¯æ£ããèŠããŸãã ããã§ã¯ãml_util_funcãåŒã³åºããŠããäžåºŠèŠãŠã¿ãŸãããã
(gdb) step ml_util_func (a=1) at ml_main.c:5 5 return a + 1; (gdb) x/w 0x133008 0x133008: 0x0013146c
0x133008ã®å€ã倿ŽãããŸããã 0x0013146cãml_util_funcã®å®éã®ã¢ãã¬ã¹ã§ãããããŒãããŒããŒã«ãã£ãŠããã«é
眮ãããŠããããšãããããŸãã
(gdb) p &ml_util_func $1 = (int (*)(int)) 0x13146c <ml_util_func>
äºæ³éãã
ããŒãããŒããŒã«ããã¢ãã¬ã¹æ±ºå®ãå¶åŸ¡ããŸã
ããã§ãããŒããŒã«ãã£ãŠå®è¡ããããé
å»¶ãã¢ãã¬ã¹æ±ºå®ã®ããã»ã¹ã¯ãããã€ãã®ç°å¢å€æ°ïŒããã³ldãªã³ã«ãŒã®å¯Ÿå¿ããåŒæ°ïŒã«ãã£ãŠæ§æã§ããããšã«èšåãããšãã§ãã ãããã®èšå®ã¯ããããã°ãç¹å¥ãªããã©ãŒãã³ã¹èŠä»¶ã«åœ¹ç«ã€å ŽåããããŸãã
LD_BIND_NOW倿°ã¯ãå®çŸ©ãããŠããå Žåãã¬ã€ãžãŒã§ã¯ãªããèµ·åæã«ãã¹ãŠã®ã¢ãã¬ã¹ã決å®ããããããŒãããŒããŒã«æç€ºããŸãã ãã®åäœã¯ãæå®ãããŠããå Žåã®äžèšã®äŸã®gdbåºåã調ã¹ãããšã§ç¢ºèªã§ããŸãã ml_util_funcã®GOTããã®èŠçŽ ã«ã¯ãæåã®é¢æ°åŒã³åºãã®åã§ã颿°ã®å®éã®ã¢ãã¬ã¹ãå«ãŸããŠããããšãããããŸãã
察ç
§çã«ãLD_BIND_NOTã¯ãGOTãæŽæ°ããªãããã«ããŒãããŒããŒã«æç€ºããŸãã ã€ãŸãããã®å Žåã®å颿°åŒã³åºãã¯ãå®çŸ©ãã¡ãœãããééããŸãã
ããŒãããŒããŒã¯ãä»ã®ããã€ãã®ãã©ã°ã§æ§æãããŸãã man ld.soãæ¢çŽ¢ããããšããå§ãããŸãã è峿·±ãæ
å ±ããããããããŸãã
PICã³ã¹ã
ãã®PICã®åé¡ã«åãçµã¿ã解決ããªããã移転åé¡ãšã®äŒè©±ãå§ããŸããã ããããæ®å¿µãªããPICèªäœã«ãåé¡ããªãããã§ã¯ãããŸããã ãããã®1ã€ã¯ã远å ã®éæ¥ã¢ãã¬ã¹æå®ã®ã³ã¹ãã§ãã ããã¯ãã°ããŒãã«å€æ°ãŸãã¯é¢æ°ã«ã¢ã¯ã»ã¹ãããã³ã«è¿œå ã®ã¡ã¢ãªã¢ã¯ã»ã¹ã§ãã çœå®³ã®èŠæš¡ã¯ãã³ã³ãã€ã©ãããã»ããµã¢ãŒããã¯ãã£ãããã³ã¢ããªã±ãŒã·ã§ã³èªäœã«ãã£ãŠç°ãªããŸãã
å¥ã®ãããã»ã©æçœã§ã¯ãªãåé¡ã¯ãPICãå®è£
ããããã«è¿œå ã®ã¬ãžã¹ã¿ã䜿çšããããšã§ãã GOTã¢ãã¬ã¹ãé »ç¹ã«æ±ºå®ããªãããã«ãã³ã³ãã€ã©ãã¢ãã¬ã¹ãã¬ãžã¹ã¿ïŒããšãã°ãebxïŒã«æ ŒçŽããã³ãŒããçæããããšã¯çã«ããªã£ãŠããŸãã ããããããã¯ã¬ãžã¹ã¿ãŒå
šäœãGOTã«ã®ã¿è¡ãããšãæå³ããŸãã éåžžãå€ãã®ãããªãã¯ã¬ãžã¹ã¿ãæã€RISCã¢ãŒããã¯ãã£ã®å Žåãããã¯ããã»ã©å€§ããªåé¡ã§ã¯ãªããå©çšå¯èœãªã¬ãžã¹ã¿ãã»ãšãã©ãªãx86ãªã©ã®ã¢ãŒããã¯ãã£ã«ã€ããŠã¯èšããŸããã PICã䜿çšãããšãã¬ãžã¹ã¿ã1ã€å°ãªããªããŸããã€ãŸããããå€ãã®ã¡ã¢ãªã¢ã¯ã»ã¹ãå¿
èŠã«ãªããŸãã
ãããã«
ããã§ãã¢ãã¬ã¹ã«äŸåããªãã³ãŒããšã¯äœãããããŠèªã¿åãå°çšã®å
±æããã¹ãã»ã¯ã·ã§ã³ã§å
±æã©ã€ãã©ãªãäœæããã®ã«ã©ã®ããã«åœ¹ç«ã€ããããããŸããã
PICã¯ãæäœäžã®åé
çœ®ãšæ¯èŒããŠé·æãšçæããããçµæã¯å€ãã®èŠå ïŒç¹ã«ãããã°ã©ã ãå®è¡ãããããã»ããµã®ã¢ãŒããã¯ãã£ïŒã«äŸåããŸãã
ãã ããæ¬ é¥ã«ãããããããPICã¯ãŸããŸãäžè¬çãªã¢ãããŒãã«ãªãã€ã€ãããŸãã SPARC64ãªã©ã®äžéšã®Intel以å€ã®ã¢ãŒããã¯ãã£ã§ã¯ãå
±æã©ã€ãã©ãªã«PICã®äœ¿çšãå¿
é ã§ãããä»ã®å€ãïŒARMãªã©ïŒã§ã¯ãPICãããå¹ççã«ããããã«IPäŸåã®ã¢ãã¬ã¹æå®ãå¿
èŠã§ãã ãããšãåŸç¶ã®x86-x64ã®äž¡æ¹ã«åœãŠã¯ãŸããŸãã
ããã©ãŒãã³ã¹ã®åé¡ãšããã»ããµã¢ãŒããã¯ãã£ã«çŠç¹ãåãããŸããã§ããã ç§ã®ä»äºã¯ãPICãã©ã®ããã«æ©èœããããäŒããããšã§ããã 説æãååã«ãéæãã§ã¯ãªãã£ãå Žåã¯ãã³ã¡ã³ãã§ãç¥ãããã ããã詳现ããäŒãããŸãã
[1]ãã¡ããã1ã€ãŸã§ã®ã¢ããªã±ãŒã·ã§ã³ããã¹ãŠãã®ã©ã€ãã©ãªãåãä»®æ³ã¢ãã¬ã¹ã«ããŠã³ããŒãããªãéãã ããããããã¯éåžžLinuxã§ã¯è¡ãããŸããã
[2] 0x444ïŒããã³ããã§èšåããä»ã®ãã¹ãŠã®ã¢ãã¬ã¹ïŒã¯ãã©ã€ãã©ãªãããŒããããã¢ãã¬ã¹ã«é¢é£ããçžå¯Ÿã¢ãã¬ã¹ã§ãã ãã®ã¢ãã¬ã¹ã¯ãã©ã€ãã©ãªãããŒãããããŸã§äžæã§ãã ã³ãŒãã¯çžå¯Ÿã¢ãã¬ã¹ã§ã®ã¿æ©èœãããããããã¯æ£åžžã§ããããšã«æ³šæããŠãã ããã
[3] , .got â : , data? . ELF , . , , data , . , ELF- . data- .
[5] ELF / - .
[6] Linux â , .
[8] , , GOT : .got .got.plt. , , GOT, , PLT. , GOT GOT. , .got, â .got.plt. , â .got-.