-
-
[翻译]自解密中的乐趣
-
发表于: 2018-6-25 14:55 3563
-
2018-02-25,作者ViRb3
校对id:玉林小学生
译者id:frust
[本文作者为ViRb3,如果想在本博客发表文章,请先参考链接]
一个月前我正在参加每年一度的Hack Cambridged大会。且不说以往的编程和社交,在这次CTF比赛中,遭遇了强大对手——Avast团队。实际上,这也在很大程度上鼓舞了我,于是把任务带回家并在此完工。所有难题里面有一个非常有意思——一段两次自解密代码泄露了一点个秘密!我们今天就借助x64dbg来解析这个秘密。关于比赛更多信息参考文末。
经过之前的分析后,我们得到如下代码
===========================================================
| [ ADDR3S5 ] - [ H3X DUMP ] ------ [ C0MM4ND ] |
===========================================================
| [ 00401000 ] > [ 31 C0 ] ------ [ XOR EAX,EAX ] |
| [ 00401002 ] . [ B0 40 ] ------ [ MOV AL,40 ] |
| [ 00401004 ] . [ C1 E0 10 ] ------ [ SHL EAX,10 ] |
| [ 00401007 ] . [ 80 F4 20 ] ------ [ XOR AH,20 ] |
| [ 0040100A ] . [ FF D0 ] ------ [ CALL EAX ] |
| [ 0040100C ] . [ 50 ] ------ [ PUSH EAX ] |
| [ 0040100D ] . [ 8A 50 03 ] ------ [ MOV DL,BYTE PTR DS:[EAX+3] ] |
| [ 00401010 ] . [ 30 54 01 04 ] ------ [ XOR BYTE PTR DS:[EAX+ECX+4],DL ] |
| [ 00401014 ] . [ FE C1 ] ------ [ INC CL ] |
| [ 00401016 ] . [ 80 F9 64 ] ------ [ CMP CL,64 ] |
| [ 00401019 ] . [ 75 F5 ] ------ [ JNE SHORT 00401010 ] |
| [ 0040101B ] . [ 80 E9 5F ] ------ [ SUB CL,5F ] |
| [ 0040101E ] . [ 00 C8 ] ------ [ ADD AL,CL ] |
| [ 00401020 ] . [ FF D0 ] ------ [ CALL EAX ] |
| [ 00401022 ] . [ F4 ] ------ [ HLT ] |
============================================================================
| [ ADDR3S5 ] - [ M3M0RY H3X DUMP ] |
===========================================================
| [ 00402000 ] : [ 31 C9 C3 C0 | 1E 40 2C D0 | 3E 80 CA 41 | B0 CB C0 C0 ] |
| [ 00402010 ] : [ C9 DA 40 A8 | D3 DA 40 A8 | D8 F3 F0 00 | 90 03 2F D7 ] |
| [ 00402020 ] : [ 94 4A 1F 00 | 9E EC 3A 97 | DD 9E D9 EE | AD 3C 96 0D ] |
| [ 00402030 ] : [ E0 DF 9E E7 | 32 6B F7 D8 | 1D EA E1 CD | 6A 7E 6F 04 ] |
| [ 00402040 ] : [ 0A 0A 0A 0B | 0A 0A 0A 0B | 02 0B 7C 0A | 0A 0A 0B 0A ] |
| [ 00402050 ] : [ 0A 79 0C 0B | 0D 0C 09 03 | 03 79 0A 7F | 02 7C 7F 03 ] |
| [ 00402060 ] : [ 7F 0B 7C 08 | 03 79 0A 7F | 00 00 00 00 | 00 00 00 00 ] |
===========================================================
针对上述情况主要有两种方法:用x86模拟器(比如Unicorn),或者用调试器劫持执行流并用上面dump文件里的指令替换原来执行流,我觉得后者更有趣并且更便捷。于是这种情况下我们用第二个方法继续深入下去。
首先,我们需要将dump下来的数据以字节的形式查看。这一步我手动完成的,并以如下形式分隔hex转储和内存转储。
Hex dump (starts at 0x00401000):
Hex dump (从0x00401000开始):
31 C0 B0 40 C1 E0 10 80 F4 20 FF D0 50 8A 50 03 30 54 01 04 FE C1 80 F9 64 75 F5 80 E9 5F 00 C8 FF D0 F4
Memory dump (starts at 0x00402000):
Memory dump (从0x00402000开始):
31 C9 C3 C0 1E 40 2C D0 3E 80 CA 41 B0 CB C0 C0 C9 DA 40 A8 D3 DA 40 A8 D8 F3 F0 00 90 03 2F D7
94 4A 1F 00 9E EC 3A 97 DD 9E D9 EE AD 3C 96 0D E0 DF 9E E7 32 6B F7 D8 1D EA E1 CD 6A 7E 6F 04
0A 0A 0A 0B 0A 0A 0A 0B 02 0B 7C 0A 0A 0A 0B 0A 0A 79 0C 0B 0D 0C 09 03 03 79 0A 7F 02 7C 7F 03
7F 0B 7C 08 03 79 0A 7F 00 00 00 00 00 00 00 00
然后我们需要找出一段可执行空间。启动x32dbg(不是x64dbg,因为当前我们处理的是32位代码),打开任意一个32位可执行程序。这里我们直接打开x32.dbg自身得了。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [翻译]自解密中的乐趣 3564
- [求助]预售 |《0day安全 软件漏洞分析技术》正版图书 4626
- [分享]汇编语言实现邮件发送 5835