
ãã®èšäºã§ã¯ã2018幎12æã®2.30ãªãªãŒã¹ã«GNU ldã§è¿œå ãããå°ããªã»ãã¥ãªãã£æ©èœã«çŠç¹ãåœãŠãŸãã ãã·ã¢èªã§ã¯ããã®æ¹åã¯opennetã§æ¬¡ã®æ³šéä»ãã§èšåãããŸãã ã
ã-zåå¥ã³ãŒããã¢ãŒãããµã€ãºãšã¡ã¢ãªæ¶è²»ããããã«å¢å ãããŸãããå®è¡å¯èœãã¡ã€ã«ã®ã»ãã¥ãªãã£ãåäžããŸã
ãããçè§£ããŸãããã ç§ãã¡ã話ããŠããã»ãã¥ãªãã£åé¡ã®çš®é¡ãšè§£æ±ºçã説æããããã«ããã€ããªè匱æ§ãšã¯ã¹ããã€ãã®äžè¬çãªæ©èœããå§ããŸãããã
æªçšå¶åŸ¡ãããŒã®åé¡
æ»æè
ã¯ãããŸããŸãªè匱æ§ã®å©ããåããŠãããã°ã©ã ã«ããŒã¿ã転éãããã®æ¹æ³ã§æäœã§ããŸããé
åå¢çãè¶
ããã€ã³ããã¯ã¹ã«ããæžã蟌ã¿ãæååã®å®å
šã§ãªãã³ããŒããªãªãŒã¹åŸã®ãªããžã§ã¯ãã®äœ¿çšã ãã®ãããªãšã©ãŒã¯ãCããã³C ++ããã°ã©ã ã³ãŒãã§ã¯äžè¬çã§ãããããã°ã©ã ã®ç¹å®ã®å
¥åããŒã¿ã§ã¡ã¢ãªãç Žæããå¯èœæ§ããããŸãã
ã¡ã¢ãªç Žæã®è匱æ§CWE-20ïŒäžé©åãªå
¥åæ€èšŒ
CWE-118ïŒã€ã³ããã¯ã¹å¯èœãªãªãœãŒã¹ãžã®äžæ£ãªã¢ã¯ã»ã¹ïŒãç¯å²ãšã©ãŒãïŒ
CWE-119ïŒã¡ã¢ãªãããã¡ãŒã®å¢çå
ã§ã®æäœã®äžé©åãªå¶é
CWE-120ïŒå
¥åãµã€ãºããã§ãã¯ããªããããã¡ãŒã³ããŒïŒãã¯ã©ã·ãã¯ãããã¡ãŒãªãŒããŒãããŒãïŒ
CWE-121ïŒã¹ã¿ãã¯ããŒã¹ã®ãããã¡ãªãŒããŒãããŒ
CWE-122ïŒããŒãããŒã¹ã®ãããã¡ãªãŒããŒãããŒ
CWE-123ïŒæžã蟌ã¿å Žææ¡ä»¶
CWE-124ïŒãããã¡ãŒã¢ã³ããŒã©ã€ãïŒããããã¡ãŒã¢ã³ããŒãããŒãïŒ
CWE-125ïŒç¯å²å€èªã¿åã
CWE-126ïŒãããã¡ãŒã®ãªãŒããŒãªãŒã
CWE-127ïŒãããã¡ãŒã¢ã³ããŒãªãŒã
CWE-128ïŒã©ããã¢ã©ãŠã³ããšã©ãŒ
CWE-129ïŒé
åã€ã³ããã¯ã¹ã®äžé©åãªæ€èšŒ
CWE-130ïŒé·ããã©ã¡ãŒã¿ãŒã®äžæŽåã®äžé©åãªåŠç
CWE-131ïŒãããã¡ãŒãµã€ãºã®èª€ã£ãèšç®
CWE-134ïŒå€éšå¶åŸ¡ã®ãã©ãŒãããæååã®äœ¿çš
CWE-135ïŒãã«ããã€ãæååã®é·ãã®èª€ã£ãèšç®
CWE-170ïŒäžé©åãªãã«çµäº
CWE-190ïŒæŽæ°ãªãŒããŒãããŒãŸãã¯ã©ããã¢ã©ãŠã³ã
CWE-415ïŒããã«ããªãŒ
CWE-416ïŒè§£æŸåŸäœ¿çš
CWE-476ïŒNULLãã€ã³ã¿ãŒéåç
§
CWE-787ïŒå¢ç倿žã蟌ã¿
CWE-824ïŒåæåãããŠããªããã€ã³ã¿ãŒã®ã¢ã¯ã»ã¹
...
ã¡ã¢ãªç Žæã®ãããªè匱æ§ã®å
žåçãªæªçšèŠçŽ ã¯ãã¡ã¢ãªå
ã®ãã€ã³ã¿ãäžæžãããããšã§ãã ãã®åŸãããã°ã©ã ã¯ãã€ã³ã¿ã䜿çšããŠãå¥ã®ã³ãŒãã«å¶åŸ¡ãæž¡ããŸããã€ãŸããå¥ã®ã¢ãžã¥ãŒã«ããã¯ã©ã¹ã¡ãœãããŸãã¯é¢æ°ãåŒã³åºãã颿°ããæ»ããŸãã ãŸãããã€ã³ã¿ãŒãäžæžãããããããã³ã³ãããŒã«ã¯æ»æè
ã«ååãããŸããã€ãŸããæ»æè
ãæºåããã³ãŒããå®è¡ãããŸãã ãããã®ææ³ã®ããªãšãŒã·ã§ã³ã詳现ã«èå³ãããå Žåã¯ã ããã¥ã¡ã³ããèªãããšããå§ãããŸã ã
ãã®ãããªãšã¯ã¹ããã€ãã®æäœã®ãã®äžè¬çãªç¬éã¯ç¥ãããŠãããããã§ã¯æ»æè
ã«ãšã£ãŠé·ãééå£ã眮ãããŠããŸãã
- å¶åŸ¡ãæž¡ãåã«ãã€ã³ã¿ãŒã®æŽåæ§ããã§ãã¯ããïŒã¹ã¿ãã¯Cookieãå¶åŸ¡ãããŒã¬ãŒãããã€ã³ã¿ãŒèªèšŒ
- ã³ãŒããšããŒã¿ã䜿çšããã»ã°ã¡ã³ãã¢ãã¬ã¹ã®ã©ã³ãã åïŒã¢ãã¬ã¹ç©ºéã¬ã€ã¢ãŠãã®ã©ã³ãã å
- ã³ãŒããã³ãŒãã»ã°ã¡ã³ãå€ã§å®è¡ãããªãããã«ããïŒå®è¡å¯èœé åã®ä¿è·
次ã«ãåŸè
ã®ã¿ã€ãã®ä¿è·ã«çŠç¹ãåœãŠãŸãã
å®è¡å¯èœã¹ããŒã¹ä¿è·
ããã°ã©ã ã¡ã¢ãªã¯ç°çš®ã§ãããèªã¿åããæžã蟌ã¿ãå®è¡ã®åæš©éãæã€ã»ã°ã¡ã³ãã«åå²ãããŸãã ããã¯ãããŒãžããŒãã«ã®ã¢ã¯ã»ã¹ãã©ã°ã§ã¡ã¢ãªããŒãžãããŒã¯ããããã»ããµã®æ©èœã«ãã£ãŠä¿èšŒãããŸãã ä¿è·ã®æŠå¿µã¯ãã³ãŒããšããŒã¿ã®å³å¯ãªåé¢ã«åºã¥ããŠããŸãïŒåŠçäžã«æ»æè
ããåä¿¡ããããŒã¿ã¯ã å®è¡äžå¯èœãªã»ã°ã¡ã³ãïŒã¹ã¿ãã¯ãããŒãïŒã«é
眮ããããã°ã©ã èªäœã®ã³ãŒãã¯å¥ã
ã®äžå€ã®ã»ã°ã¡ã³ãã«é
眮ããå¿
èŠããããŸãã ãããã£ãŠãããã«ãããæ»æè
ã¯ã¡ã¢ãªå
ã«ç¡é¢ä¿ãªã³ãŒããé
眮ããŠå®è¡ããããšãã§ããªããªããŸãã
ããŒã¿ã»ã°ã¡ã³ãã§ã®ã³ãŒãå®è¡ã®çŠæ¢ãåé¿ããããã«ãã³ãŒãåå©çšæè¡ã䜿çšãããŸãã ã€ãŸããæ»æè
ã¯å®è¡å¯èœããŒãžã«ããã³ãŒããã©ã°ã¡ã³ãïŒä»¥éãã¬ãžã§ãããšåŒã³ãŸãïŒã«å¶åŸ¡ãæž¡ããŸãã ãã®çš®ã®æè¡ã¯ãé£æåºŠãããŸããŸã§ãæé ã§ãã
- æ»æè
ã«ååãªæ©èœãå®è¡ãã颿°ã«å¶åŸ¡ãç§»ãïŒä»»æã®ã·ã§ã«ã³ãã³ããå®è¡ããå¶åŸ¡ãããåŒæ°ãæã€ã·ã¹ãã ïŒïŒé¢æ°ïŒret2libcïŒ
- ä¿è·ãç¡å¹ã«ããããã¡ã¢ãªã®äžéšãå®è¡å¯èœã«ããïŒããšãã°ã
mprotect()
åŒã³åºãmprotect()
ã¬ãžã§ããã®æ©èœãŸãã¯ãã§ãŒã³ã«å¶åŸ¡ã転éãããã®åŸã«ä»»æã®ã³ãŒããå®è¡ãã - ã¬ãžã§ããã®é·ããã§ãŒã³ã䜿çšãããã¹ãŠã®ç®çã®ã¢ã¯ã·ã§ã³ã®å®è¡
ãããã£ãŠãæ»æè
ã¯ãããããªã¥ãŒã ãŸãã¯å¥ã®ããªã¥ãŒã ã§æ¢åã®ã³ãŒããåå©çšããã¿ã¹ã¯ã«çŽé¢ããŠããŸãã ããã1ã€ã®é¢æ°ã«æ»ããããè€éãªå Žåãã¬ãžã§ããã®ãã§ãŒã³ãã³ã³ãã€ã«ããå¿
èŠããããŸã ã å®è¡å¯èœã»ã°ã¡ã³ãã§ã¬ãžã§ãããæ€çŽ¢ããã«ã¯ãããŒã«ropper ã ropgadgetããããŸãã
ããŒã«READ_IMPLIES_EXEC
ãã ããããŒã¿ã®ããã¡ã¢ãªé åãå®è¡å¯èœãªå Žåããããäžèšã®ã³ãŒããšããŒã¿ã®åé¢ã®ååã«æããã«éåããŠããŸãã ãã®ãããªå Žåãæ»æè
ã¯ã³ãŒããåå©çšããããã®ã¬ãžã§ãããæ©èœãèŠã€ããæéãçããŸãã ãã®çš®ã®è峿·±ãçºèŠã¯ãå®è¡å¯èœãªã¹ã¿ãã¯ãš1ã€ã®ãç£æ¥çšãã¡ã€ã¢ãŠã©ãŒã«ãäžã®ãã¹ãŠã®ããŒã¿ã»ã°ã¡ã³ãã§ããã
ãªã¹ã/proc/$pid/maps
ïŒ
00008000-00009000 r-xp 00000000 08:01 10 /var/flash/dmt/nx_test/a.out 00010000-00011000 rwxp 00000000 08:01 10 /var/flash/dmt/nx_test/a.out 00011000-00032000 rwxp 00000000 00:00 0 [heap] 40000000-4001f000 r-xp 00000000 1f:02 429 /lib/ld-linux.so.2 4001f000-40022000 rwxp 00000000 00:00 0 40027000-40028000 r-xp 0001f000 1f:02 429 /lib/ld-linux.so.2 40028000-40029000 rwxp 00020000 1f:02 429 /lib/ld-linux.so.2 4002c000-40172000 r-xp 00000000 1f:02 430 /lib/libc.so.6 40172000-40179000 ---p 00146000 1f:02 430 /lib/libc.so.6 40179000-4017b000 r-xp 00145000 1f:02 430 /lib/libc.so.6 4017b000-4017c000 rwxp 00147000 1f:02 430 /lib/libc.so.6 4017c000-40b80000 rwxp 00000000 00:00 0 be8c2000-be8d7000 rwxp 00000000 00:00 0 [stack]
ããã§ã¯ããã¹ããŠãŒãã£ãªãã£ããã»ã¹ã®ã¡ã¢ãªã«ãŒãã衚瀺ãããŸãã ãããã¯ãã¡ã¢ãªé å-ããŒãã«è¡ã§æ§æãããŸãã æåã«ãå³ã®åã«æ³šæããŠãã ãã-ãšãªã¢ã®å
容ïŒã³ãŒãã»ã°ã¡ã³ãã颿°ã©ã€ãã©ãªã®ããŒã¿ãŸãã¯ããã°ã©ã èªäœïŒãŸãã¯ãã®ã¿ã€ãïŒããŒããã¹ã¿ãã¯ïŒã説æããŸãã å·ŠåŽã«ã¯ãåã¡ã¢ãªé åãå æããã¢ãã¬ã¹ã®ç¯å²ãšãããã«ã¢ã¯ã»ã¹æš©ãã©ã°rïŒèªã¿åãïŒãwïŒæžã蟌ã¿ïŒãxïŒå®è¡ïŒãé çªã«è¡šç€ºãããŸãã ãããã®ãã©ã°ã¯ããããã®ã¢ãã¬ã¹ã§ã¡ã¢ãªã®èªã¿åããæžã蟌ã¿ãããã³å®è¡ã詊ã¿ããšãã®ã·ã¹ãã ã®åäœã決å®ããŸãã æå®ãããã¢ã¯ã»ã¹ã¢ãŒãã«éåãããšãäŸå€ãçºçããŸãã
ããã»ã¹å
ã®ã»ãšãã©ãã¹ãŠã®ã¡ã¢ãªïŒã¹ã¿ãã¯ãããŒãããã¹ãŠã®ããŒã¿ã»ã°ã¡ã³ãïŒãå®è¡å¯èœã§ããããšã«æ³šæããŠãã ããã ããã¯åé¡ã§ãã æããã«ãã¡ã¢ãªã®rwxããŒãžã®ååšã¯ãæ»æè
ã«ãšã£ãŠãããŒã¿ïŒãã±ããããã¡ã€ã«ïŒãåŠçã®ããã«ããŒã¿ã転éãããšãã«ã³ãŒããååŸããä»»æã®å Žæã§ããã®ãããªããã»ã¹ã§ã³ãŒããèªç±ã«å®è¡ã§ãããããçæŽ»ã楜ã«ããŸãã
ããŒããŠã§ã¢ã®ããŒã¿ããŒãžã§ã®ã³ãŒãå®è¡ã®çŠæ¢ããµããŒãããææ°ã®ããã€ã¹ã§ãã®ãããªç¶æ³ãçºçããã®ã¯ãªãã§ããïŒäŒæ¥ããã³ç£æ¥ãããã¯ãŒã¯ã®ã»ãã¥ãªãã£ã¯ããã€ã¹ã«äŸåããŠãããåé¡ãšãã®è§£æ±ºçã¯éåžžã«é·ãéç¥ãããŠããŸããïŒ
ãã®ç¶æ³ã¯ãããã»ã¹ã®åæåïŒã¹ã¿ãã¯ã®å²ãåœãŠãããŒããã¡ã€ã³ELFã®ããŒããªã©ïŒäžããã³æ žããã»ã¹åŒã³åºãã®å®è¡äžã®ã«ãŒãã«ã®åäœã«ãã£ãŠæ±ºãŸããŸãã ããã«åœ±é¿ããéèŠãªå±æ§ã¯ãæ§æ Œãã©ã°READ_IMPLIES_EXEC
ã§ãã ãã®ãã©ã°ã®å¹æã¯ãèªã¿åãå¯èœãªã¡ã¢ãªãå®è¡å¯èœã«ãªãããšã§ãã ããã€ãã®çç±ã«ãããããã»ã¹ã«ãã©ã°ãèšå®ã§ããŸãã
- éåžžã«è峿·±ãã¡ã«ããºã ãå®è£
ããããã«ãã¬ã¬ã·ãŒã¯ELFããããŒã®ãœãããŠã§ã¢ãã©ã°ã«ãã£ãŠæç€ºçã«èŠæ±ã§ããŸãïŒã¹ã¿ãã¯äžã®ã¹ããªã³ã°ããŒãïŒ 1ã2ã3 ïŒ
- 芪ããåããã»ã¹ã«ç¶æ¿ã§ããŸãã
- ã«ãŒãã«ã«ãã£ãŠãã¹ãŠã®ããã»ã¹ã«åå¥ã«ã€ã³ã¹ããŒã«ã§ããŸãïŒ ãŸããã¢ãŒããã¯ãã£ãéå®è¡å¯èœã¡ã¢ãªããµããŒãããŠããªãå Žåã 第äºã«ã 念ã®ãããä»ã®å€ä»£ã®æŸèæããµããŒãããŸãã ãã®ã³ãŒãã¯ã«ãŒãã«2.6.32ïŒARMïŒã«ãããéåžžã«é·ã寿åœããããŸããã ããã¯ãŸãã«ç§ãã¡ã®ã±ãŒã¹ã§ããã
ELFç»åã§ã¬ãžã§ãããèŠã€ããããã®ã¹ããŒã¹
颿°ã©ã€ãã©ãªãšããã°ã©ã å®è¡å¯èœãã¡ã€ã«ã¯ELF圢åŒã§ãã gccã³ã³ãã€ã©ãŒã¯ãèšèªæ§é ããã·ã³ã³ãŒãã«å€æããŠ1ã€ã®ã»ã¯ã·ã§ã³ã«é
眮ãããã®ã³ãŒããä»ã®ã»ã¯ã·ã§ã³ã§æäœããããŒã¿ãé
眮ããŸãã å€ãã®ã»ã¯ã·ã§ã³ããããldãªã³ã«ãŒã«ãã£ãŠã»ã°ã¡ã³ãã«ã°ã«ãŒãåãããŸãã ãããã£ãŠãELFã«ã¯ãã»ã¯ã·ã§ã³ã®ããŒãã«ãšã»ã°ã¡ã³ãã®ããŒãã«ãšãã2ã€ã®è¡šçŸãæã€ããã°ã©ã ã€ã¡ãŒãžãå«ãŸããŠããŸãã
$ readelf -l /bin/ls Elf file type is EXEC (Executable file) Entry point 0x804bee9 There are 9 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x08048034 0x08048034 0x00120 0x00120 RE 0x4 INTERP 0x000154 0x08048154 0x08048154 0x00013 0x00013 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.2] LOAD 0x000000 0x08048000 0x08048000 0x1e40c 0x1e40c RE 0x1000 LOAD 0x01ef00 0x08067f00 0x08067f00 0x00444 0x01078 RW 0x1000 DYNAMIC 0x01ef0c 0x08067f0c 0x08067f0c 0x000f0 0x000f0 RW 0x4 NOTE 0x000168 0x08048168 0x08048168 0x00044 0x00044 R 0x4 GNU_EH_FRAME 0x018b74 0x08060b74 0x08060b74 0x00814 0x00814 R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10 GNU_RELRO 0x01ef00 0x08067f00 0x08067f00 0x00100 0x00100 R 0x1 Section to Segment mapping: Segment Sections... 00 01 .interp 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame 03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 04 .dynamic 05 .note.ABI-tag .note.gnu.build-id 06 .eh_frame_hdr 07 08 .init_array .fini_array .jcr .dynamic .got
ããã§ã¯ãELFã€ã¡ãŒãžã®ã»ã°ã¡ã³ããžã®ã»ã¯ã·ã§ã³ã®ãããã³ã°ã確èªã§ããŸãã
ã»ã¯ã·ã§ã³ããŒãã«ã¯ããŠãŒãã£ãªãã£ãããã°ã©ã ãšã©ã€ãã©ãªãåæããããã«äœ¿çšãããŸãããããŒããŒãELFãããã»ã¹ã¡ã¢ãªã«æåœ±ããããã«ã¯äœ¿çšãããŸããã ã»ã¯ã·ã§ã³ããŒãã«ã¯ãã»ã°ã¡ã³ãããŒãã«ããã詳现ã«ELFæ§é ã説æããŸãã è€æ°ã®ã»ã¯ã·ã§ã³ã1ã€ã®ã»ã°ã¡ã³ãå
ã«å«ããããšãã§ããŸãã
ã€ã³ã¡ã¢ãªELFã€ã¡ãŒãžã¯ã ã»ã°ã¡ã³ãããŒãã«ã®å
容ã«åºã¥ããŠELFããŒããŒã«ãã£ãŠäœæãããŸãã ããŒãã£ã·ã§ã³ããŒãã«ã¯ãELFãã¡ã¢ãªã«ããŒãããããã«äœ¿çšãããªããªããŸããã
ãã ãããã®ã«ãŒã«ã«ã¯äŸå€ããããŸããããšãã°ãèªç¶ã«ã¯ãARMã¢ãŒããã¯ãã£çšã®ELF ld.soããŒããŒçšã®Debianéçºè
ãããããããŸããããã¯ã SHT_ARM_ATTRIBUTESãªã©ã®ç¹å¥ãªã.ARM.attributesãã»ã¯ã·ã§ã³ãæ¢ããŠããããã®ãããªã·ã¹ãã ã§åæãããã»ã¯ã·ã§ã³ããŒãã«ãæã€ãã€ããªã¯ããŒããããŸãã...
ELFã»ã°ã¡ã³ãã«ã¯ãã»ã°ã¡ã³ããã¡ã¢ãªå
ã§æã€èš±å¯ã決å®ãããã©ã°ããããŸãã åŸæ¥ãGNU / Linuxã®ã»ãšãã©ã®ãœãããŠã§ã¢ã¯ã2ã€ã®PT_LOAD
ïŒã¡ã¢ãªããŒãïŒã»ã°ã¡ã³ããã»ã°ã¡ã³ãããŒãã«ã§å®£èšãããããã«æ§ç¯ãããŸãã-äžèšã®ãªã¹ãã®ããã«ïŒ
RE
ãã©ã°ä»ãã®ã»ã°ã¡ã³ã
1.1ã ELF å®è¡å¯èœã³ãŒãïŒ .init
ã .text
ã .fini
1.2ã ELFã®äžå€ããŒã¿ïŒ .symtab
ã .rodata
RW
ãã©ã°ã»ã°ã¡ã³ã
2.1ã ELFã®å€æŽå¯èœãªããŒã¿ïŒã»ã¯ã·ã§ã³.plt
ã .got
ã .data
ã .bss
æåã®ã»ã°ã¡ã³ãã®æ§æãšãã®ã¢ã¯ã»ã¹ãã©ã°ã«æ³šæãæããšããã®ãããªã¬ã€ã¢ãŠãã«ãããã³ãŒãåå©çšæè¡ã®ã¬ãžã§ãããæ€çŽ¢ããããã®ã¹ããŒã¹ãæ¡å€§ããããšãæããã«ãªããŸãã libcryptoãªã©ã®å€§èŠæš¡ãªELFã§ã¯ããµãŒãã¹ããŒãã«ããã³ãã®ä»ã®äžå€ããŒã¿ãå®è¡å¯èœã»ã°ã¡ã³ãã®æå€§40ïŒ
ãå ããå¯èœæ§ããããŸãã ãã®ããŒã¿å
ã®ã³ãŒãã®æçã«äŒŒããã®ã®ååšã¯ãã»ã¯ã·ã§ã³ããŒãã«ãšã·ã³ãã«ãªãã§å®è¡å¯èœã»ã°ã¡ã³ãå
ã®å€§éã®ããŒã¿ãå«ããã®ãããªãã€ããªãã¡ã€ã«ãéã¢ã»ã³ãã«ãã詊ã¿ã«ãã£ãŠç¢ºèªãããŸãã ãã®åäžã®å®è¡å¯èœã»ã°ã¡ã³ãå
ã®åãã€ãã·ãŒã±ã³ã¹ã¯ããã·ã³ã³ãŒãããã³ã¹ããªã³ã°ããŒãã®æ»æãã©ã°ã¡ã³ãã«åœ¹ç«ã€ãšèŠãªãããšãã§ããŸã-ããã°ã©ã ããã®ãããã°ã¡ãã»ãŒãžã®å°ãªããšãäžéšãã·ã³ãã«ããŒãã«å
ã®é¢æ°åã®äžéšããŸãã¯æå·ã¢ã«ãŽãªãºã ã®å®æ°ãå«ããã®ãã€ãã·ãŒã±ã³ã¹ã§ã...
PEå®è¡å¯èœããããŒELFã€ã¡ãŒãžã®æåã®ã»ã°ã¡ã³ãã®å
é ã«ããå®è¡å¯èœãªããããŒãšããŒãã«ã¯ãçŽ15幎åã®Windowsã®ç¶æ³ã«äŒŒãŠããŸãã ãã¡ã€ã«ã«ææãããŠã€ã«ã¹ã倿°ãããPEããããŒã«ã³ãŒããæžã蟌ãã§ãããPEããããŒãããã§å®è¡å¯èœã§ããã ã¢ãŒã«ã€ãã§ãã®ãããªãµã³ãã«ãæãäžããããšãã§ããŸããã

ã芧ã®ãšãããPEããããŒã®é åã®ã»ã¯ã·ã§ã³ããŒãã«ã®çŽåŸã«ãŠã€ã«ã¹æ¬äœãå§çž®ãããŠããŸãã ä»®æ³ã¡ã¢ãªãžã®ãã¡ã€ã«ã®æåœ±ã§ã¯ãéåžžãçŽ3 KBã®ç©ºãé åããããŸãã ãŠã€ã«ã¹ã®æ¬äœã®åŸã«ç©ºã®ã¹ããŒã¹ããããæåã®ã»ã¯ã·ã§ã³ã¯ããã°ã©ã ã³ãŒãã§å§ãŸããŸãã
ãã ããLinuxã®å ŽåãVXã·ãŒã³ã®ããã«è峿·±ãäœåã å ±åŸ©ããããŸãã ã
解決ç
- äžã§èª¬æãããåé¡ã¯é·ãéç¥ãããŠããŸãã ã
- 2018幎1æ12æ¥ä¿®æ£ïŒ `ld -z Separate-codeïŒkey is createdïŒ"ãªããžã§ã¯ãã«åå¥ã®ã³ãŒã "PT_LOAD"ã»ã°ã¡ã³ãããããŒãäœæããŸããããã¯ãåœä»€ã®ã¿ãå«ãå¿
èŠããããä»ã®ããŒã¿ããå®å
šã«åãé¢ãããã¡ã¢ãªã»ã°ã¡ã³ããæå®ããŸãã noseparate-codeã䜿çšããå Žåã¯ãå¥åã®ã³ãŒããPT_LOADãã»ã°ã¡ã³ããäœæããªãã§ãã ããã "ïŒã ãã®æ©èœã¯ãªãªãŒã¹2.30ã§ãªãªãŒã¹ãããŸãã ã
- ããã«ããã®æ©èœã¯æ¬¡ã®ãªãªãŒã¹2.31ã§ããã©ã«ãã§å«ãŸããŠããŸããã
- Ubuntu 18.10ãªããžããªãªã©ãæ°ãã
binutils
ããã±ãŒãžã«ååšããŸãã ElfMasterã®ç ç©¶è
ãééããææžåãããã®æ°æ©èœã䜿çšããŠãå€ãã®ããã±ãŒãžãæ¢ã«çµã¿ç«ãŠãããŠããŸã
ã¬ã€ã¢ãŠãã¢ã«ãŽãªãºã ã®å€æŽã®çµæãæ°ããELFç»åãååŸãããŸãã
$ readelf -l ls Elf file type is DYN (Shared object file) Entry point 0x41aa There are 11 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x00000034 0x00000034 0x00160 0x00160 R 0x4 INTERP 0x000194 0x00000194 0x00000194 0x00013 0x00013 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.2] LOAD 0x000000 0x00000000 0x00000000 0x01e6c 0x01e6c R 0x1000 LOAD 0x002000 0x00002000 0x00002000 0x14bd8 0x14bd8 RE 0x1000 LOAD 0x017000 0x00017000 0x00017000 0x0bf80 0x0bf80 R 0x1000 LOAD 0x0237f8 0x000247f8 0x000247f8 0x0096c 0x01afc RW 0x1000 DYNAMIC 0x023cec 0x00024cec 0x00024cec 0x00100 0x00100 RW 0x4 NOTE 0x0001a8 0x000001a8 0x000001a8 0x00044 0x00044 R 0x4 GNU_EH_FRAME 0x01c3f8 0x0001c3f8 0x0001c3f8 0x0092c 0x0092c R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10 GNU_RELRO 0x0237f8 0x000247f8 0x000247f8 0x00808 0x00808 R 0x1 Section to Segment mapping: Segment Sections... 00 01 .interp 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt 03 .init .plt .plt.got .text .fini 04 .rodata .eh_frame_hdr .eh_frame 05 .init_array .fini_array .data.rel.ro .dynamic .got .data .bss 06 .dynamic 07 .note.ABI-tag .note.gnu.build-id 08 .eh_frame_hdr 09 10 .init_array .fini_array .data.rel.ro .dynamic .got
ã³ãŒããšããŒã¿ã®å¢çãããæ£ç¢ºã«ãªããŸããã å¯äžã®å®è¡å¯èœã»ã°ã¡ã³ãã«ã¯ãå®éã«ã¯ã³ãŒãã»ã¯ã·ã§ã³ã®ã¿ãå«ãŸããŸãïŒ.initã.pltã.plt.gotã.textã.finiã
ldå
ã§æ£ç¢ºã«äœã倿ŽãããŸãããïŒãåãã®ãšãããåºåELFãã¡ã€ã«ã®æ§é ã¯ã ãªã³ã«ãŒã¹ã¯ãªããã«ãã£ãŠèšè¿°ãããŸã ã æ¬¡ã®ãããªããã©ã«ãã®ã¹ã¯ãªãããèŠãããšãã§ããŸãïŒ
$ ld --verbose GNU ld (GNU Binutils for Ubuntu) 2.26.1 * * * using internal linker script: ================================================== /* Script for -z combreloc: combine and sort reloc sections */ /* Copyright (C) 2014-2015 Free Software Foundation, Inc. * * *
ç°ãªããã©ãããã©ãŒã ããã³ãªãã·ã§ã³ã®çµã¿åããã®ããã®ãã®ä»ã®å€ãã®ã¹ã¯ãªããã¯ã ldscripts
ãã£ã¬ã¯ããªã«ãããŸãã separate-code
ãªãã·ã§ã³çšã®æ°ããã¹ã¯ãªãããäœæãããŸããã
$ diff elf_x86_64.x elf_x86_64.xe 1c1 < /* Default linker script, for normal executables */ --- > /* Script for -z separate-code: generate normal executables with separate code segment */ 46a47 > . = ALIGN(CONSTANT (MAXPAGESIZE)); 70a72,75 > . = ALIGN(CONSTANT (MAXPAGESIZE)); > /* Adjust the address for the rodata segment. We want to adjust up to > the same address within the page on the next page up. */ > . = SEGMENT_START("rodata-segment", ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)));
ããã§ã¯ãã³ãŒãã»ã°ã¡ã³ãã®åŸã«èªã¿åãå°çšã»ã¯ã·ã§ã³ãæã€æ°ããã»ã°ã¡ã³ãã宣èšããããã®ãã£ã¬ã¯ãã£ãã远å ãããŠããããšãããããŸãã
ãã ããã¹ã¯ãªããã«å ããŠããªã³ã«ãŒãœãŒã¹ã«å€æŽãå ããããŸããã ã€ãŸãã颿°_bfd_elf_map_sections_to_segments
åç
§ããŠãã ããã çŸåšãã»ã¯ã·ã§ã³ã®ã»ã°ã¡ã³ããéžæãããšãã«ãã»ã¯ã·ã§ã³ãåã®ã»ã¯ã·ã§ã³ãšSEC_CODE
ãã©ã°ã§ç°ãªãå Žåãæ°ããã»ã°ã¡ã³ãã远å ãããŸãã
ãããã«
以åãšåæ§ã« ããœãããŠã§ã¢ãéçºããéã«ãã³ã³ãã€ã©ãŒãšãªã³ã«ãŒã«çµã¿èŸŒãŸããã»ãã¥ãªãã£ãã©ã°ã䜿çšããããšãéçºè
ãå¿ããªãããšããå§ãããŸãã ãã®ãããªå°ããªå€æŽã¯ãæ»æè
ã®ç掻ã倧å¹
ã«è€éã«ããããªããããç©ããã«ããŸãã