ææ¥ã7æ2æ¥11:00ã«ãµã³ã¯ãããã«ãã«ã¯ã§éå¬ãããNeoQUEST-2015 察決ã®åå€ã«ããªã³ã©ã€ã³ã¹ããŒãžã®æåŸã®çµã¿ç«ãŠãããŠããªãã¿ã¹ã¯ã®èšäºãå ¬éããŸãïŒ
ã€ãã³ããžã®å ¥å Žã¯ç¡æã§ãããæ å ±ã»ãã¥ãªãã£ã«é¢å¿ã®ãããã¹ãŠã®äººããåŸ ã¡ããŠããŸãïŒ NeoQUESTã¯ãäœãæ°ããããšãåŠã³ããããã«ãŒãã¹ãã«ãåäžãããååãšã³ãã¥ãã±ãŒã·ã§ã³ãåããæé«ã®ããã«ãŒã®æ±ºå®çãªç«¶äºãèŠãŠãçŽ æŽãããæéãéãããã£ã³ã¹ã§ãïŒ
NeoQUEST-2015ã¬ããŒãã®éå¬å°ãšãããã¯ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã
ããã¶ãŒãã®ããã«ãæ®ããããªã³ã©ã€ã³ã¹ããŒãžã®ã¿ã¹ã¯ã¯ãããªãå€ããã®ã§ãããé·ãéå¿ããããŠãããããããŒãã£ã¹ã¯ããã³ãããããšã«ã€ããŠè©±ããŠããã°ååã§ããã ã¯ãšã¹ãåå è ãã©ã®ããã«ãªããŒã¹ãšQEMUãããããªããã°ãªããªãã£ããã«ã€ããŠ-ã«ããã®äžã§ïŒ
ã¿ã¹ã¯ã®åæããŒã¿ãã©ãããŸããïŒ
ã¿ã¹ã¯ã§ã¯ãtask.binãã¡ã€ã«ãåæããŒã¿ãšããŠæ©èœããŸãã å¡äŸããå€æãããšãããŒããã£ã¹ã±ããã®ã€ã¡ãŒãžã§ããã¯ãã§ãã ããããã¡ã€ã«ãŠãŒãã£ãªãã£ã«éããŸãããã
ä»®å®ã¯çå®ã§ããããšãå€æããŸãããããã¯ãã£ã¹ã±ããã§ãã ããŠãããããèµ·åããŠã¿ãŸãããã ä»®æ³ãã·ã³ãšããŠãQEMUã䜿çšããŸãã å®è¡ãã
qemu âfda task.bin
ãããŠ...
...ãããŠäœããªãã äœããã®çç±ã§ãèµ·åã«å€±æããŸãã-QEMUã¯ãLoadingããšæžã蟌ã¿ããã³ã°ããŸããã æåã«ãgdbããããã¬ãšããŠä»®æ³ãã·ã³ã«æ¥ç¶ããŠãä»®æ³ãã·ã³å ã§äœãèµ·ããããèŠãŠã¿ãŸãããã gdbãæ¥ç¶ããã«ã¯ãä»®æ³ãã·ã³ã®åäœã¢ãŒããç¥ãããšãéèŠã§ããããã¯ãã¢ããªã±ãŒã·ã§ã³ãããããã¬ãŒã«éä¿¡ãããããŒã¿ã®åœ¢åŒã«åœ±é¿ããããã§ãã
ä»®æ³ãã·ã³ïŒå éšãã¥ãŒ
QEMUãŠã£ã³ããŠã«ç§»åããCtrl + Alt + 2ãæŒããŠã³ãã³ãã³ã³ãœãŒã«ãéããŸãã ãã®äžã§ãæ å ±ã¬ãžã¹ã¿ããå®è¡ããCtrl + Upã®çµã¿åããã§äžã«ã¹ã¯ããŒã«ããŸãããã
äžã®å³ã¯ã泚æãå¿ èŠãªãã£ãŒã«ãã®æŠèŠã瀺ããŠããŸã-CR0ããã³CSãæããã³ãã«ã®å±æ§ã CR0ããã³CS.ATTRã®å€ãããä»®æ³ã¡ã¢ãªãªãã§ä¿è·ã¢ãŒããæå¹ã«ãªãã32ãããã³ãŒããå®è¡ãããããšãããããŸãã ç§ãã¡ã«ãšã£ãŠãããã¯gdbã§æ¬¡ã®ã³ãã³ãã§ã¢ãŒããåãæ¿ããå¿ èŠãããããšãæå³ããŸã
set architecture i386
gdbã32ãããã®å Žåããã®ã¢ãŒããã¯ãã£ã¯ããã©ã«ãã§èšå®ãããŸãã
ãâsããªãã·ã§ã³ïŒãã®ãªãã·ã§ã³ã䜿çšãããšãããã¬ãŒãæ¥ç¶ã§ããŸãïŒãæå®ããŠQEMUãå®è¡ããã³ãã³ããtarget remote localhostïŒ1234ããå®è¡ããŠgdbãæå¹ã«ããŸãã EIPã«é¢ããããã€ãã®æ瀺ãåºåããä»®æ³ãã·ã³ãHALTã«ãããã¹ã¿ãã¯ã«ãŒããããããšã確èªããŸãã ããããæ¥ãå Žæã¯å®å šã«ç解ã§ããŸããã å解ããå¿ èŠãããããã§ãã
ã³ãŒãã®å解ãšãããã°
HALTã®ãžã£ã³ããçºçããå Žæãææ¡ããŠãã³ãŒããé çªã«éã¢ã»ã³ãã«ããŠãããã°ããŸãã ãããããŒãã£ã¹ã¯ã®æåã®ã»ã¯ã¿ãŒããå§ããŸãããã ã¬ã¬ã·ãŒã¢ãŒãã§ãããããŒããèµ·åããå ŽåïŒãããŠããã以å€ã®å Žåã¯ããããåäœããŸããïŒãBIOSã¯æåã®ã»ã¯ã¿ãŒãèªã¿åãã0x7c00ã§èªã¿èŸŒã¿ãŸãã ã»ãšãã©ã®å Žåãæåã®ã»ã¯ã¿ãŒã®ã³ãŒãã®ã¿ã¹ã¯ã¯ããã£ã¹ã¯ãããç¶ç¶ããããŒãããä¿è·ã¢ãŒãã«åãæ¿ããããšã§ãã ddããã³objdumpãŠãŒãã£ãªãã£ã䜿çšããŠãã©ããªçš®é¡ã®ã³ãŒããããã®ãââèŠãŠã¿ãŸãããã
ã³ãŒããæåããå°ãã¹ã¯ããŒã«ãããšãä¿è·ã¢ãŒããžã®ç§»è¡ã確èªã§ããŸãã ããã§ã®ljmpåœä»€ã¯ã³ãŒãã»ã¬ã¯ã¿ãŒãå€æŽããããã«äœ¿çšãããé·ç§»ã¢ãã¬ã¹ã¯0x7c61ã§ãã å解ãããšãã«0x7c00ã«çããããŒã¹ãæå®ããªãã£ãããããªã¹ãã§ã¯ã¢ãã¬ã¹0x7c61ã¯0x61ã«å¯Ÿå¿ããŠããŸãã
ããã¯éåžžã32ãããã³ãŒãã®å®è¡ãéå§ããããã«è¡ãããŸãã ããã«ãã¢ãã¬ã¹ãgdtrã¬ãžã¹ã¿ã«ãããå€ã0x7d95ã«ããã0x7c4dïŒãªã¹ãã§ã¯0x4dïŒã«ããlgdtwåœä»€ã§ããŒããããŠããgdtæ§é äœãèŠã€ããããšã§ããã確èªã§ããŸãã
gdtã§ã¯ããªãã»ãã8ã®èšè¿°åã®ã¿ã€ãã調ã¹ãå¿ èŠããããŸããããã¯ljmpåœä»€ã®æåã®åŒæ°ã§ãã ããã¯ã0x7c61ã®ã³ãŒãã32ãããã§ããããšãæå³ããŸããã€ãŸããä»ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠobjdumpãéã¢ã»ã³ãã«ããå¿ èŠããããŸãã task.binãããªãã»ãã0x61ã§å¯Ÿè±¡ã®ã³ãŒããéžæãã32ããããšããŠéã¢ã»ã³ãã«ããŸãã
çµæã®ã³ãŒãã§ã¯ãæ°ããå€ãã»ã¬ã¯ã¿ãŒã«ããŒããããã¢ãã¬ã¹0x80000ãžã®ãžã£ã³ããè¡ãããŸãã ä»®æ³ãã·ã³ãå®è¡ãããã®ã¢ãã¬ã¹ã«ãã¬ãŒã¯ãã€ã³ããèšå®ããŸãã ãããè¡ãã«ã¯ãQEMUã¯æ¬¡ã®ã³ãã³ãã§éå§ããŸã
qemu âs âS âfda task.bin
gdbã¯ä»¥åãšåãããã«æ¥ç¶ãããŸãã ãã¬ãŒã¯ãã€ã³ããã¢ãã¬ã¹ã«èšå®ããŸã-gdbã®ãb * 0x80000ããç¶è¡-ãcãã ãã¬ãŒã¯ãã€ã³ããããªã¬ãŒãããåŸãããã€ãã®æ瀺ã衚瀺ãããŸãã
æåã®jmpããsiãã³ãã³ãã§å®è¡ããå®è¡ããã³ãŒããå床åºåããŸãã
æåã®retã®åã®ã³ãŒãã¯åå²ãè±å¯ã§ã¯ãªããäœããçºçããå¯èœæ§ãããåŒã³åºãã¯1ã€ã ãã§ãã 0x82961ã§4Kã¡ã¢ãªããã³ãããŠãããã§å®è¡ãããã³ãŒãã®çš®é¡ãèŠãŠã¿ãŸãããã ã¡ã¢ãªãã³ãã¯ã次ã®ã³ãã³ãã䜿çšããŠgdbããååŸã§ããŸãã
çµæã®ãã³ãã³ãã³ããéã¢ã»ã³ãã«ããŸã
objdump âD âb binary âm i386 ./eip_dump.bin > eip.txt
0x82961ã®é¢æ°ã«ã¯éåžžã«å€ãã®åŒã³åºããå«ãŸããŠããŸãããããèªäœã¯æåŸã«1ã€ã®retãæã€é£ç¶ããã³ãŒãã§ãã åæ¢ããå Žæã«é¢å¿ããããŸãã衚瀺ãããã³ãŒãã«ã¯åæ¢ããªãããããã¹ãŠã®åŒã³åºãã«ãã¬ãŒã¯ãã€ã³ããèšå®ããé¢æ°ã®æåŸã«æ»ããŸãã
é¢å¿ã®ããã¢ãã¬ã¹ã®ãªã¹ãã¯æ¬¡ã®ãšããã§ãã0x82970ã0x82aefã0x82A5Bã0x82A7Dã0x82A91ã0x82AB0ã0x82AEFã0x82B10ã0x82B32ã0x82B46ã0x82B65ã0x82C53ã0x82CADã 次ã«ãå®è¡ãç¶ç¶ããåãã¬ãŒã¯ãã€ã³ãã»ããã§é£ç¶ããŠãã©ãŒã«ã¢ãŠãããŸãã ãã¬ãŒã¯ãã€ã³ãã«é¢å¿ãããããã®åŸãã¬ãŒã¯ãçºçããŸãã retã«èšå®ããããã¬ãŒã¯ãã€ã³ãã§ããããšãå€æããŸãã-調æ»äžã®é¢æ°ã®æåŸã§ãã ããã¯äºæ³å€ã§ãããretã®åã«ããã·ã¥ããããšã«æ³šæãæããšãããã¯åŒã³åºããã€ã³ããžã®æ»ãã§ã¯ãªããæ°ããã³ãŒããžã®å¶åŸ¡ã®è»¢éã§ããããšãæããã«ãªããŸãã siãå®è¡ããã¢ãã¬ã¹0x4000020ã«å°éããŸãã
ãã£ããŒãã€ãã«ã¿ã¹ã¯ãéå§ããŸããïŒ
æãåºããšãhaltåœä»€ã¯0x4000260ã«ãããçŸåšã®eipã«ã¯ããã«è¿ãã§ãã å床åŒã³åºããæ¢ããããæã§ãã¬ãŒã¯ãã€ã³ããèšå®ãããããªãããã«ã次ã®ããã«ããŸã-ã«ãŒãå ã®1ã€ã®åœä»€ãå®è¡ãã次ã®åœä»€ãåºåããŠeipïŒ= 0x4000260ã確èªããç°¡åãªã¹ã¯ãªãããèšè¿°ããŸãã ã¹ã¯ãªããã¯æ¬¡ã®ãšããã§ãã
b *0x4000020 commands 1 while $pc != 0x4000260 x /1i $pc si end x /1i $pc end c
script.txtãã¡ã€ã«ã«ã¹ã¯ãªãããé 眮ããsourceã³ãã³ãã䜿çšããŠgdbã§å®è¡ããŸãã å®è¡åŸã次ã®çµæãåŸãããŸãã
ã³ãŒãå ã§2ã€ã®cpuidåŒã³åºããå°è±¡çã§ããã®åŸãã³ã°ãçºçããŸãã ãããã¯ããçš®ã®ãã§ãã¯ã®ããã§ãã 圌ãããã§ãã¯ãããã®ãèŠãŠã¿ãŸãããã æåã®åŒã³åºãã¯ããã©ã¡ãŒã¿ãŒeax = 0x80000000ã§è¡ãããŸãããã®çµæãeaxã«ã¯ãcpuidåœä»€ã«æž¡ãããšãã§ãããã©ã¡ãŒã¿ãŒã®æ倧å€ãå«ãŸããŸãã 次ã«ãå€ã0x80000001ãšæ¯èŒãããŸããããã¯ã次ã®åŒã³åºããè¡ãå¯èœæ§ã®ãã¹ãã§ãã 2çªç®ã®åŒã³åºãã¯ãã©ã¡ãŒã¿ãŒeax = 0x800000001ã䜿çšããŠè¡ãããedxã®29çªç®ã®ãããããã§ãã¯ãããŸããããã¯ããã³ã°ã¢ãŒãããµããŒããããŠããå Žåã¯1ã«èšå®ãããŸãã
å®è¡ããŠããQEMUããã³ã°ã¢ãŒãããµããŒãããŠããªããããä»®æ³ãã·ã³ãããªãŒãºããŠããããã§ãã 次ã®ããã«ä»®æ³ãã·ã³ãèµ·åããŸãã
ãã£ããŒããªããšãã¿ã¹ã¯ãå®è¡ã§ããïŒ æ®ã£ãŠããå¯äžã®ããšã¯ãããå®çŸããããšã§ãïŒ äžè¬ã«ãäœæ¥äžã®Linuxã64ãããã§ããã°ãäžèšã®ããªãŒãºã®åé¡ã¯çºçããŸããã§ããã ãã®å Žåãã·ã¹ãã ã®åŠçèœåã«äžéããããŸããã
ãã¹ã¯ãŒãæšæž¬
ã¿ã¹ã¯èªäœã«å°éãããšãäœãããå¿ èŠãããããæããã«ãªããŸãã ã©ããããæ€èšŒã¢ã«ãŽãªãºã ãæºããããã¹ã¯ãŒãããéžæããå¿ èŠããããŸãã ãããè¡ãã«ã¯ããã¹ã¯ãŒããæ€èšŒãããå ŽæãèŠã€ããŸãã
ãã¹ã¯ãŒãæ€èšŒã«ã§ããéãè¿ããšããã§ãä»®æ³ãã·ã³ã®å®è¡ãåæ¢ããããšããŸãã ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããåã«ãå ¥åãããã¹ã¯ãŒãã4è¡ç®ã«å°å·ãããããšã«æ°ä»ããããããŸããã ã»ãšãã©ã®å Žåããã®æç¹ã§ãã§ãã¯ã¯ãŸã å®äºããŠããªãããããã®å Žæã§ãããã¬ããæãåºããšããã§ã«ãã¹ãã«åæ ŒããŠããªããã¹ã¯ãŒãããã§ã«å ¥åãããŠããããšãããããŸãã ç»é¢ã«ãã¹ã¯ãŒãã衚瀺ããããã®æ€èšŒãé çªã«åŒã³åºãããæ©èœã«ã¹ã¿ãã¯ã移åããããã«æ®ããŸãã
é©åãªå Žæã«å°éããããã«ãã³ãŒãã®ã©ãã«ãã¬ãŒã¯ãã€ã³ãã眮ããã決å®ããæ¹æ³ã¯ïŒ ç»é¢ã«æåãå°å·ããã«ã¯ã次ã®2ã€ã®æ¹æ³ããããŸãã
- ç°¡åãªæ¹æ³ã¯ãããã¹ãã¢ãŒãã§0xb8000ã®ãããªã¡ã¢ãªã«æåãæžã蟌ãããšã§ããããã¯ãèµ·åæã«ããã©ã«ãã§æå¹ã«ãªã£ãŠããŸãã
- é£ããæ¹æ³ã¯ããããªã«ãŒããæ§æããç»é¢äžã«ãã€ã³ããæç»ãããã©ã³ãã䜿çšããŠãã€ã³ãã«ã·ã³ãã«ãæç»ããæ©èœãæäŸãããã©ã€ããŒãèšè¿°ããããšã§ãã ããã§è¡ãããŠããããã«ããã©ã€ããŒã®ä»£ããã«VBE BIOSã䜿çšã§ããŸãã
ç°¡åãªæ¹æ³ã䜿çšããããšããŸãã 次ã«ããããªã¡ã¢ãªãã€ãŸã4è¡ç®ã®æåã®æåã«ã¢ã¯ã»ã¹ããããã®ãã¬ãŒã¯ãã€ã³ããèšå®ã§ããŸãã ãããªã¡ã¢ãªã¯ã¢ãã¬ã¹0xb8000ã§å§ãŸããæååãµã€ãºã¯80æåã§ãåæåã«2ãã€ãïŒæå+è²ïŒãå²ãåœãŠãããç®çã®ã¢ãã¬ã¹ã¯0xb8000 + 80 * 2 * 3 = 0xb81e0ã§ãã gdbã®ã¡ã¢ãªã«æžã蟌ãããã«ãã¬ãŒã¯ãã€ã³ããèšå®ããã³ãã³ãã¯æ¬¡ã®ããã«ãªããŸãã
watch *0xb81e0
ä»®å®ã¯çå®ã§ããã£ã©ã¯ã¿ãŒãã¡ã¢ãªã«æžã蟌ãã çŽåŸã«è±èœããŸããã ãã¬ãŒã¯ãã€ã³ãã¯äžèŠã«ãªããŸãããåé€ã§ããŸãã ãã1ã€ä»®å®ããŠã¿ãŸããã-å°å·ãšãã¹ã¯ãŒãã®ç¢ºèªã³ãŒããé çªã«åŒã³åºãããé¢æ°ããããšããŸãããã ãœãŒã¹ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
ç§ãã¡ã®ç®æšã¯ãCheckPassïŒïŒé¢æ°ãèŠã€ããããšã§ãã ãããè¡ãã«ã¯ãPrintPassïŒïŒã«åã蟌ãŸããé¢æ°ããã®æ»ãã¢ãã¬ã¹ã«ãã¬ãŒã¯ãã€ã³ããèšå®ããå®è¡ãç¶ç¶ããŸãã æ°ããã€ã³ã¹ããŒã«ãããã¬ãŒã¯ãã€ã³ãããè±èœããããã¹ã¯ãŒããæ£ãããããŸããããšããã¡ãã»ãŒãžããŸã å°å·ãããŠããªãå Žåã¯ãæ°ãããã®ãå ¥ããŠç¶è¡ããŸãã
å°å·ããå ŽåãæåŸãã2çªç®ã®ã»ããã¯å¿ èŠãªãã®ã§ããã¿ã¹ã¯ïŒïŒã®æ¬äœã§PrintPassïŒïŒãåŒã³åºããçŽåŸã«ãããç«ã£ãŠããŸããã è¿ä¿¡å äœæãååŸããæ¹æ³ãèŠã€ããŸãã ã³ãŒããç¹å®ã®ãã©ã°ãªãã§ã³ã³ãã€ã«ãããå Žåãé¢æ°ã®å é ã«ãããã·ã¥$ rbp; mov $ rspã$ rbpâæ°ããã¹ã¿ãã¯ãã¬ãŒã ã圢æãããŸãã ãã®å Žåãæ»ãã¢ãã¬ã¹ã¯$ rbp + 8ã«ä¿åãããŸãã ããã¯ç°¡åã«ç¢ºèªã§ããŸãã
å®éãã¢ãã¬ã¹0xfffff8000020e5b5ã®åã«callã¹ããŒãã¡ã³ãããããŸãã ããã§èšç»ãå®è¡ã§ããŸãã
ã¹ã¯ãªãããæžã
ã¹ã¿ãã¯ã®æ·±ããããããªããããç»é¢ã«ããã¹ã¯ãŒããæ£ãããããŸããããšè¡šç€ºããããŸã§QEMUãã¹ã¿ãã¯ãèµ·åããgdbã®å°ããªã¹ã¯ãªãããäœæããŸãã
set confirm off # save start values of first 4 chars from 5th row of screen set $start_vmem_val = *(unsigned long long*)(0xb8280) set $curr_vmem_val = $start_vmem_val # if nothing changed in 5th row of screen, we continue while $start_vmem_val == $curr_vmem_val # delete all old breakpoints d # get return addres from stack and set breakpoint on it. Then, continue. set $ret_addr = *(unsigned long long*)($rbp + 8) b *$ret_addr c set $curr_vmem_val = *(unsigned long long*)(0xb8280) end
以åã«è¡ã£ãããã«ãã¹ã¯ãªããããã¡ã€ã«ã«ä¿åãããœãŒã¹ã³ãã³ããå®è¡ããŸãã 次ã®ãã®ãåŸãããŸãã
ã¹ã¯ãªããã¯ã0x20069cã®ãã¬ãŒã¯ãã€ã³ãã«å°éããã«ã¯ã©ãã·ã¥ããŸããããããã¹ã¯ãŒããæ£ãããããŸããããšããã¡ãã»ãŒãžãåºåãããŸããã ããã¯ãtaskïŒïŒãšåŒã°ããé¢æ°ããããšããä»®å®ãæ£ããããšãæå³ããŸãã ãã³ã°ã¯ãããã¹ã¯ãŒããæ£ãããããŸããããšããã¡ãã»ãŒãžãç»é¢ã«åºåãããåŸã«ã¿ã¹ã¯ïŒïŒé¢æ°ãæ»ããªãããšã瀺ããŸãã ãã ããããã¯éèŠã§ã¯ãããŸãããäž»ãªããšã¯ãæåŸãã13çªç®ã®ãã¬ãŒã¯ãã€ã³ããèšå®ããPrintPassïŒïŒé¢æ°ããã®æ»ãã¢ãã¬ã¹ãç¥ã£ãŠããããšã§ãã
æ€çŽ¢ãç¶è¡ãããŸã...
åä¿¡ããã°ããã®ã¢ãã¬ã¹0xfffff80000205808ãããã¹ã¯ãŒãã確èªããæé ã®æ€çŽ¢ãç¶è¡ããŸããQEMUãå®è¡ãããã®ã¢ãã¬ã¹ã«ãã¬ãŒã¯ãã€ã³ããèšå®ããŠãä»»æã®ãã¹ã¯ãŒããå ¥åããŸãã RIPããæ°ãã€ãæ»ã£ãŠãå ã»ã©æ®ããé¢æ°ã®ã¢ãã¬ã¹ãèŠã€ããããšã§ãã³ãŒããã³ããåé€ããŸãã
ã³ãã³ããobjdump âD âb binary âm i386ïŒx86-64 âadjust-vma = 0xfffff800002057fc task.bin> task.txtãã䜿çšããŠãçµæã®ãã³ããéã¢ã»ã³ãã«ããŸãã
0xfffff80000203358ã§é¢æ°ãçµäºããã ãã§ããããã®ã¢ãã¬ã¹ã¯åä¿¡ãããã³ãã§æ°åæ€åºãããããšã«æ³šæããŠãã ããã
fffff800002057fc <.data>ïŒ
fffff800002057e3ïŒ48 8d 85 60 ff ff ff lea -0xa0ïŒïŒ rbpïŒãïŒ rax
fffff800002057eaïŒ48 89 c6 movïŒ raxãïŒ rsi
fffff800002057edïŒ48 bf 56 15 21 00 00 movabs $ 0xfffff80000211556ãïŒ rdi
fffff800002057f4ïŒf8 ff ff
fffff800002057f7ïŒb8 00 00 00 00 mov $ 0x0ãïŒ eax
fffff800002057fcïŒ48 ba 58 33 20 00 00 movabs $ 0xfffff80000203358ãïŒ rdx
fffff80000205803ïŒf8 ff ff
fffff80000205806ïŒff d2 callq *ïŒ rdx
rip => fffff80000205808ïŒ48 b8 08 15 21 00 00 movabs $ 0xfffff80000211508ãïŒ rax
fffff8000020580fïŒf8 ff ff
...
fffff80000205930ïŒ48 bf 65 15 21 00 00 movabs $ 0xfffff80000211565ãïŒ rdi
fffff80000205937ïŒf8 ff ff
fffff8000020593aïŒb8 00 00 00 00 mov $ 0x0ãïŒ eax
fffff8000020593fïŒ48 ba 58 33 20 00 00 movabs $ 0xfffff80000203358ãïŒ rdx
fffff80000205946ïŒf8 ff ff
fffff80000205949ïŒff d2 callq *ïŒ rdx
...
fffff8000020594dïŒ48 bf 78 15 21 00 00 movabs $ 0xfffff80000211578ãïŒ rdi
fffff80000205954ïŒf8 ff ff
fffff80000205957ïŒb8 00 00 00 00 mov $ 0x0ãïŒ eax
fffff8000020595cïŒ48 ba 58 33 20 00 00 movabs $ 0xfffff80000203358ãïŒ rdx
fffff80000205963ïŒf8 ff ff
fffff80000205966ïŒff d2 callq *ïŒ rdx
èæ ®ãããã³ãŒãã¯64ãããã§ããã64ãããã³ãŒãã§äœ¿çšããã2ã€ã®äž»ãªåŒã³åºãèŠåããããŸãã
- ã Microsoft x64åŒã³åºãèŠçŽ ã
- ã System V ABI ã
ãã®å ŽåãåŒã³åºãã®åŒæ°ã¯RDIãRSIãRDXã¬ãžã¹ã¿ãªã©ãä»ããŠæž¡ããããããSystem Vã䜿çšãããŸãã æäœéãããã¹ãã衚瀺ããé¢æ°ãæ®ããŸããããã®é¢æ°ã¯æ°ååŒã³åºãããŸãã åŒæ°0xfffff80000211556ãš-0xa0ïŒïŒ rbpïŒã§æåã«åŒã³åºããã2åç®ã¯0xfffff80000211565ã§ã3åç®ã¯0xfffff80000211578ã§åŒã³åºãããŸãã ãããã®ã¢ãã¬ã¹ã«ãããã®ãèŠãŠã¿ãŸãããã
é¢æ°0xfffff80000203358ã¯printfã§ããããã§ãã¯ã®çµæã«å¿ããŠãç°ãªãã¡ãã»ãŒãžã衚瀺ããŸãã æååã123ãã¯å ¥åããããã¹ã¯ãŒãã§ãã 衚瀺ãããã¡ãã»ãŒãžã«å¿ããŠèŠãŠã¿ãŸãããã
fffff8000020591cïŒmovabs $ 0xfffff800002114c0ãïŒ rax
fffff80000205926ïŒmov 0x38ïŒïŒ raxïŒãïŒ rax
fffff8000020592aïŒcmp $ 0x1ãïŒ rax ifïŒg_struct.res == 1ïŒ
ã==== <fffff8000020592eïŒjne 0xfffff8000020594d {
| fffff80000205930ïŒmovabs $ 0xfffff80000211565ãïŒ rdi
| fffff8000020593aïŒmov $ 0x0ãïŒ eax
| fffff8000020593fïŒmovabs $ 0xfffff80000203358ãïŒ rdx
| fffff80000205949ïŒcallq *ïŒ rdx printfïŒãæ£ãããã¹ã¯ãŒãïŒãïŒ;
| ã== <fffff8000020594bïŒjmp 0xfffff80000205968}
`====> fffff8000020594dïŒmovabs $ 0xfffff80000211578ãïŒ rdi else
| fffff80000205957ïŒmov $ 0x0ãïŒ eax {
| fffff8000020595cïŒmovabs $ 0xfffff80000203358ãïŒ rdx
| fffff80000205966ïŒcallq *ïŒ rdx printfïŒããã¹ã¯ãŒããæ£ãããããŸããããïŒ;
`==> fffff80000205968ïŒmovabs $ 0xfffff80000204b83ãïŒ rax}
fffff80000205972ïŒcallq *ïŒ rax some_funcïŒïŒ;
fffff80000205974ïŒleaveq
fffff80000205975ïŒretq
æ€èšŒçµæã¯ãæ§é äœã®ã¢ãã¬ã¹0xfffff800002114c0ã«ãªãã»ãã0x38ã§ä¿åãããŸãã æ€èšäžã®é¢æ°ã«ãã®æ§é äœãžã®åŒã³åºãããããã©ãããèŠãŠã¿ãŸãããã
fffff8000020587cïŒmov $ 0x48ãïŒ edx
fffff80000205881ïŒmov $ 0x0ãïŒ esi
fffff80000205886ïŒmovabs $ 0xfffff800002114c0ãïŒ rdi
fffff80000205890ïŒmovabs $ 0xfffff80000203d40ãïŒ rax
fffff8000020589aïŒcallq *ïŒ rax memsetïŒïŒg_structã0ã0x48ïŒ;
fffff8000020589cïŒlea -0xa0ïŒïŒ rbpïŒãïŒ rdx
fffff800002058a3ïŒmovabs $ 0xfffff800002114c0ãïŒ rax
fffff800002058adïŒmovïŒ rdxãïŒïŒ raxïŒ*ïŒu64 *ïŒïŒg_struct = password;
fffff800002058b0ïŒlea -0xa0ïŒïŒ rbpïŒãïŒ rdx
fffff800002058b7ïŒmovabs $ 0xfffff800002114c0ãïŒ rax
fffff800002058c1ïŒmovïŒ rdxã0x20ïŒïŒ raxïŒ*ïŒïŒu64 *ïŒïŒg_struct + 4ïŒ= password;
ã³ãŒãã®äžã«ã¯ã3ã€ã®åŒæ°ãæã€é¢æ°åŒã³åºããããããã®ãã¡ã®1ã€ã¯æ§é äœãžã®ãã€ã³ã¿ãŒã§ãã ãã®é¢æ°ã®ã³ãŒãã«ç®ãåãããšããããmemsetã§ããããšãæããã«ãªããŸãã å ¥åããããã¹ã¯ãŒããå«ãè¡ãžã®ãã€ã³ã¿ãŒã¯ããªãã»ãã0ããã³32ïŒ0x20ïŒã§æ§é äœã«2åæžã蟌ãŸããŸãã ã©ãããããã¯åæåã§ãã åæåããçµæã®ç¢ºèªãŸã§ã®ã³ãŒããèŠããšã次ã®ããšãããããŸãã
; äžèšã¯g_structæ§é äœã®åæåã§ã
fffff800002058c5ïŒmovzbl -0x1ïŒïŒ rbpïŒãïŒ eax l_var1 = -0x1ïŒïŒ rbpïŒ;
fffff800002058c9ïŒmovïŒ raxãïŒ rdi
fffff800002058ccïŒmovabs $ 0xfffff80000203e94ãïŒ rax
fffff800002058d6ïŒcallq *ïŒ rax ifïŒfunc1ïŒl_var1ïŒïŒ
fffff800002058d8ïŒtestïŒ raxãïŒ rax {
fffff800002058dbïŒseteïŒ al
fffff800002058deïŒtestïŒ alãïŒ al
ã==== <fffff800002058e0ïŒje 0xfffff80000205909
| fffff800002058e2ïŒmovabs $ 0xfffff80000211508ãïŒ rax asmïŒ
| fffff800002058ecïŒmovïŒïŒ raxïŒãïŒ rax push * 0xfffff80000211508
| fffff800002058efïŒmovïŒ raxãïŒ rdx retq
| fffff800002058f2ïŒpushïŒ rdxïŒ;
| fffff800002058f3ïŒretq
| fffff800002058f4ïŒmovzbl -0x1ïŒïŒ rbpïŒãïŒ eax
| fffff800002058f8ïŒmovïŒ raxãïŒ rdi
| fffff800002058fbïŒmovabs $ 0xfffff800002040b2ãïŒ rax
| fffff80000205905ïŒcallq *ïŒ rax func2ïŒl_var1ïŒ;
| ã== <fffff80000205907ïŒjmp fffff8000020591c}
`====> fffff80000205909ïŒmovzbl -0x1ïŒïŒ rbpïŒãïŒ eax else
| fffff8000020590dïŒmovïŒ raxãïŒ rdi {
| fffff80000205910ïŒmovabs $ 0xfffff800002040b2ãïŒ rax
| fffff8000020591aïŒcallq *ïŒ rax func2ïŒl_var1ïŒ;
`==> fffff8000020591cïŒmovabs $ 0xfffff800002114c0ãïŒ rax}
; 以äžã¯ãã§ãã¯ãšåºåã§ã
ãã¹ã¯ãŒã確èªã³ãŒããå«ãå¯èœæ§ã®ããã³ãŒãå ã®ãã©ã³ãã¯ãé»è²ã§åŒ·èª¿è¡šç€ºãããŸãã ã³ãŒãã®äžå€®ã®push / retã³ã³ã¹ãã©ã¯ãã¯ããå¥åŠã«èŠããŸããããã¯ããã®åŸã®å®è¡ãã©ã®ããã«ç¶ãããæ確ã§ã¯ãªãããã§ãã ç§ãã¡ã¯ãŸã ãã¹ã¯ãŒã確èªæ©èœãæ¢ããŠããŸãã
ã¢ãã¬ã¹0xfffff800002040b2ããã³0xfffff80000203e94ã®é¢æ°ã¯ãå ¥åããããã¹ã¯ãŒãã䜿çšãããèŠã€ãã£ãæ§é ã«ã¢ã¯ã»ã¹ããŸããã èå³æ·±ãã®ã¯ãã¢ãã¬ã¹0xfffff80000600000ãžã®ãžã£ã³ããè¡ãããããã·ã¥ãretqåœä»€ã®ã«ããã«ã§ããããã®ã¢ãã¬ã¹ã«ã©ã®ãããªã³ãŒãããããã確èªããããšãããšã次ã®ããã«ãªããŸãã
å®è¡ããããšãããšãã¢ãã¬ã¹0xfffff80000209ac5ã«ç§»åããŸãã ãªããããèµ·ãã£ãŠããã®ã§ããïŒ ã¡ã¢ãªã¢ã¯ã»ã¹ãšã©ãŒã¡ãã»ãŒãžã¯ããã®ã¢ãã¬ã¹ã§ä»®æ³ã¡ã¢ãªã䜿çšã§ããªãããšã瀺åããŠããŸãã ããã¯ãQEMUã³ã³ãœãŒã«ã§ãinfo memããå®è¡ããããšã§ç¢ºèªã§ããŸãã
å®éãã¢ãã¬ã¹0xf80000600000ããã®2ã¡ã¬ãã€ãã®ç¯å²ã¯ããããããŠããŸããã 64ãããã¢ãŒãã§ä»®æ³ã¢ãã¬ã¹ãå€æããå Žåãäžäœ4æ¡ããŒãã§ãããfã§ã¯ãªãããšã«æ³šæããŠãã ãããäžäœ16ãããã¯äœ¿çšããããã¢ãã¬ã¹0x0ã¯ã¢ãã¬ã¹0xfffff00000000000ãšçãããªããŸãã åçµãããŠããªãã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ãããšãïŒPFïŒããŒãžãã©ãŒã«ãïŒãçºçããåé¡ã®ã¢ãã¬ã¹ãCR2ã«æžã蟌ãŸãã察å¿ããäŸå€ãã³ãã©ãŒã«å¶åŸ¡ã転éãããŸãã QEMUã³ã³ãœãŒã«ã§CR2ã¬ãžã¹ã¿ã®å€ãèŠããšããã®ä»®å®ã®ç²ŸåºŠãããäžåºŠç¢ºèªã§ããŸã-0xfffff80000600000ã«çããã§ãã
ã³ãŒãã泚ææ·±ãèŠã
å²ã蟌ã¿ãã³ãã©ãŒã§ã¯ãç¶æ ã¯æåã«ä¿åãããæåã®Cã³ãŒãã¯0xfffff8000020da3cã«è¡šç€ºãããŸãã èå³æ·±ãå ŽæããããŸãïŒ
...
0xfffff8000020da5bïŒcmp $ 0xeãïŒ rax
0xfffff8000020da5fïŒjne 0xfffff8000020da95
0xfffff8000020da61ïŒmov -0x18ïŒïŒ rbpïŒãïŒ rax
0xfffff8000020da65ïŒmov 0xb8ïŒïŒ raxïŒãïŒ rdx
0xfffff8000020da6cïŒmovabs $ 0xfffff80000211508ãïŒ rax
0xfffff8000020da76ïŒmovïŒïŒ raxïŒãïŒ rax
0xfffff8000020da79ïŒcmpïŒ raxãïŒ rdx
0xfffff8000020da7cïŒjb 0xfffff8000020da95
0xfffff8000020da7eïŒmov -0x18ïŒïŒ rbpïŒãïŒ rax
0xfffff8000020da82ïŒmovïŒ raxãïŒ rdi
0xfffff8000020da85ïŒmovabs $ 0xfffff80000204df8ãïŒ rax
0xfffff8000020da8fïŒcallq *ïŒ rax
...
0xeïŒ #PF ïŒãšã®æ¯èŒã¯äŸå€ã®åå ã®ç¢ºèªã«éåžžã«äŒŒãŠããã0xfffff80000211508ã§å€0xfffff80000600000ãæ€åºãããããã«1ã€ã®æ¯èŒãè¡ãããŸãã äž¡æ¹ã®æ¡ä»¶ãæºãããããšãã¢ãã¬ã¹0xfffff80000204df8ãžã®åŒã³åºããçºçããŸãã ããã§ã次ã®ã³ãŒããèŠãããšãã§ããŸãã
...
0xfffff80000204e19ïŒmovabs $ 0xfffff8000020fda0ãïŒ rax
0xfffff80000204e23ïŒleaïŒïŒ rdxãïŒ raxã1ïŒãïŒ rax
0xfffff80000204e27ïŒmovïŒïŒ raxïŒãïŒ rdx
0xfffff80000204e2aïŒmovïŒ rdxã-0x50ïŒïŒ rbpïŒ
0xfffff80000204e2eïŒmov 0x8ïŒïŒ raxïŒãïŒ rdx
0xfffff80000204e32ïŒmovïŒ rdxã-0x48ïŒïŒ rbpïŒ
0xfffff80000204e36ïŒmov 0x10ïŒïŒ raxïŒãïŒ rax
0xfffff80000204e3aïŒmovïŒ raxã-0x40ïŒïŒ rbpïŒ
0xfffff80000204e3eïŒmov -0x50ïŒïŒ rbpïŒãïŒ rax
0xfffff80000204e42ïŒcmp $ 0x726574ãïŒ rax
0xfffff80000204e48ïŒje 0xfffff80000205418
0xfffff80000204e4eïŒcmp $ 0x726574ãïŒ rax
0xfffff80000204e54ïŒja 0xfffff80000204ea4
0xfffff80000204e56ïŒcmp $ 0x69667aãïŒ rax
0xfffff80000204e5cïŒje 0xfffff80000205067
0xfffff80000204e62ïŒcmp $ 0x69667aãïŒ rax
0xfffff80000204e68ïŒja 0xfffff80000204e87
0xfffff80000204e6aïŒcmp $ 0x616464ãïŒ rax
0xfffff80000204e70ïŒje 0xfffff80000205225
...
é¢æ°ã®å€§éšåã¯ãããã€ãã®cmp / jeåœä»€ã§å ããããŠããŸãããã®è±å¯ãã¯ãCã³ãŒãã«é·ãã¹ã€ãã/ã±ãŒã¹ããããåå€ã«ç¬èªã®ãã³ãã©ãŒãããããšã瀺åããŠããŸãã ã¢ãã¬ã¹0xfffff8000020fda0ã§èªã¿åããã8ãã€ãã®å€ã¯ããªãã»ããã䜿çšããŠæ¯èŒãšããŠæ©èœããŸãã
ãã®ã³ãŒãã«ãã¬ãŒã¯ãã€ã³ããèšå®ãããšããã¬ãŒã¯ãã€ã³ããè€æ°åå®è¡ããããªãã»ãããåžžã«24ã®åæ°ã§ããããšãããããŸãã åœä»€ã®é·ãã24ãã€ãã®ä»®æ³ãã·ã³ã®ããã«èŠããŸããæåã®8ãã€ãã¯åœä»€ã®ã·ã°ããã£ã§ãæ®ãã®16ãã€ãã¯ãã©ã¡ãŒã¿ãŒã§ãã ãdump memory vmcode.bin 0xfffff8000020fda0 0xfffff80000210da0ãã³ãã³ãã䜿çšããŠã0xfffff8000020fda0ã§ã¡ã¢ãªãã³ããäœæãã16é²ãšãã£ã¿ãŒã§éããŸãïŒæå ã«OktetaããããŸããïŒã
å³ã®å³åŽã¯ãåœä»€ã®çœ²åãASCIIæåã®çµã¿åããã®åœ¢åŒã§ãšã³ã³ãŒããããŠããããšãæ確ã«ç€ºããŠããŸãã æ瀺ã®äžã«ã¯ãllacãtixeãbusãªã©ããããéããŸã«èŠããããšã瀺åããŠããŸãã ããã¯ãCã³ãŒãã§ã¯ãåäžåŒçšç¬Šã§å²ãŸããå€ãšããŠæžã蟌ãŸãããªãã«ãšã³ãã£ã¢ã³ã§ä¿åãããŠããããã§ãã åœä»€ã®ãã©ã¡ãŒã¿ãŒã¯ãå€r0ãr1ã...ãªã©ããŸãã¯æ°å€ã§ãã
ä»®æ³ãã·ã³ã®ã³ãŒãã«ã¢ã¯ã»ã¹ããŠãã ããïŒ
ååãšããŠãä»®æ³ãã·ã³ã®ã³ãŒãã«å°éããåŸããããå解ããããšã¯æè¡çãªåé¡ã§ãã åœä»€ã·ã°ããã£ãŒã¯ãããããã©ã®ããã«æ©èœããããæ確ã«ç€ºããŠãããäœããããã«æ確ã«ããå¿ èŠãããå Žåã¯ã0xfffff80000204df8ã®é¢æ°ã§å¯Ÿå¿ãããã³ãã©ãŒãèŠã€ããã ãã§ãã æ¬äŒŒã³ãŒãã§ã¯ãVMã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
r3 = 5381; while (1) { r1 = *(u8*)r0; if (r1 == 0) break; r3 = r3 * 33 + r1; } // check DJB hash if (r3 != 0x40e1baa8ff648029) { return 0; } r5 << 64 + r3 = (u128)hexstr2val(r4) if (r5 - r3 != 0x2a60386296a57940) { return 0; } r2 = r3 >> 32; r1 = (r3 << 32) >> 32; if (r2 - r1 != 0x3394749a) { return 0; } r2 = (r3 << 32) >> 48; r1 = (r3 << 48) >> 48; if (r2 - r1 != 0x465e) { return 0; } return 1; // success
å ¥åãããè¡ããDJBããã·ã¥ã確èªããåŸãããŒãæºãããªããã°ãªããªãè¿œå ã®æ¡ä»¶ããããŸãã
ããŒéžæããã°ã©ã ã®äŸ
ããŒã¯ãã§ãã¯ã«æ瀺çã«ã¯ååšããŸããããæ¬äŒŒã³ãŒãã®4ã€ã®æ¡ä»¶ã«åºã¥ããŠãè¿ éã«éžæã§ããŸãã以äžã¯ãæ£ããããŒãéžæããããã°ã©ã ã®äŸã§ãã
int main(int argc, char **argv) { unsigned long long d64 = 0x2a60386296a57940; unsigned long long d32 = 0x3394749a; unsigned long long d16 = 0x465e; unsigned long long step = 0x1000100010001; unsigned long long key_l = ((d32 << 32) + (d16 << 48)) + ((d16 << 16) + 0); unsigned long long key_h = key_l + d64; std::stringstream key_ss; unsigned int i = 0; while (1) { key_ss << std::hex << key_h; key_ss << std::hex << std::setw(16) << std::setfill('0') << key_l; unsigned long long key_str_hash = djb2_hash(key_ss.str().c_str()); if (key_str_hash == 0x40e1baa8ff648029) { std::cout << "Success! " << i << "\n"; std::cout << "res_key = '" << key_ss.str() << "'\n"; } key_h += step; key_l += step; i++; key_ss.str(""); } return 0; }
楜ãã¿ã¯çµãããŸããïŒãã¹ã¯ãŒãæ€èšŒããã»ã¹ã§äŸå€ãã©ã®ããã«äœ¿çšãããããããã«æ確ã«ããããã«ãäžè¬çãªã³ãŒã«ãããŒå³ã以äžã«ç€ºããŸãã
VMåœä»€ã®å®è¡ãµã€ã¯ã«ã¯#PFçæã§å§ãŸããäŸå€ãã³ãã©ãŒã§1ã€ã®VMåœä»€ãå®è¡ãããŸãããã®åœä»€ãçµäºåœä»€ã§ããå Žåãlongjmpãå®è¡ãããæåã®#PFãå®è¡ãããåã«æ»ããŸãã次ã«ãéµã®æ€èšŒçµæãå°å·ãããŸããä»ã®VMåœä»€ãå®è¡ãããå ŽåãäŸå€ãã³ãã©ãŒã¯#PFãçºçããåã«ç¶æ ã埩å ãããµã€ã¯ã«ãåã³éå§ãããŸãã
ããããã¹ã¯åžæ°ãžã®è³ªå
å°ããªäœè«ïŒçµæã®ãã³ããåæããã«ã¯ãIDAã«äŒŒãéã¢ã»ã³ãã©ãŒã䜿çšãããšéåžžã«äŸ¿å©ã§ããããã¯ãã¡ã¢ãªãã³ããïŒãã³ããäºåãªã©ïŒã«ããŒãããã³ãŒããããŒã¿ãé¢æ°ããã³å€æ°ã«ååãä»ããå Žæã瀺ãããšãã§ããããã§ãããã ããIDAã®ãã¢ããã³è©Šçšçã¯64ãããã³ãŒãã§ã¯æ©èœããŸããã
ç§ã¯ãã®ç®çã®ããã«å¿ èŠãªãã¹ãŠãè¡ãããšãã§ããç¡æã®ã¬ãŒããŒ2ãé©å¿ãããããšããŸããããrasmã¯ãmovabs $ 0xfffff800002114c0ãïŒ raxãã®ãããªåœä»€ãæ£ãã解æããªããšããäºå®ã«ééããäžéšã®ããŒãžã§ã³ã§ã¯ã³ãŒããããŒããããã¢ãã¬ã¹ãèšå®ã§ããŸããïŒbin.laddrïŒã4Gbããäžã Habrã®èªè ã®1人ããradere2ã§ãã®ãããªãã³ããããŒãããŠæ確ã«åæããæ¹æ³ã説æããŠãããããæè¬ããŸãããžã§ãã®è§£æã§ã¯ãobjdumpãgdbãããã³$ EDITORã«éå®ãããŠããŸããã
NeoQUEST 2015åå è ã«äœãæåŸ ããŸããïŒ
åå è ã¯8æéã®ããªãŒã¡ãŒãœã³ã®äŒèª¬ãš7ã€ã®ã¿ã¹ã¯ãç¶ããããšãæåŸ ãããŠããŸãïŒåå è ã®ç«¶äºã®éå§ã¯10:00ã§ãïŒïŒèª²é¡ã¯æ å ±ã»ãã¥ãªãã£ã®ããŸããŸãªåŽé¢ã«é¢é£ãããããæ¢åã®ã¹ãã«ã«åŸã£ãŠã誰ããèªåã®å¥œã¿ã«åã£ã課é¡ãèŠã€ããããšãã§ããŸãã18:00ã«èŠçŽããåè ãã¡ã€ã³è³ãåãåããŸããåœéäŒè°ã®1ã€ãžã®æ è¡ããã·ã«ããŒããšããŽãŒã«ããã®åå è ãã¯ãŒã«ãªè³åãç²åŸããŸãããµã³ã¯ãããã«ãã«ã¯ã®äž»èŠãªãµã€ããŒå®å šã€ãã³ãã®åã«ã¯äœãæ®ã£ãŠããŸããïŒ