终于考完试了,爽!!!
然后就做了两道题打发闲暇时光,如图:
先来第一题:
打开题会看到让下载一个exe 文件,下载完成后,打开运行,先观察一下特征,在进行调试,这是一贯的套路,但是在这个题上,我翻车了。。。。
首先是程序运行是这么个情况:
然后我就傻乎乎的在win7x86 虚拟机上运行,还是运行不起来,然后我就懵逼了。。。。
最后清晰思路,先看一下文件本身是不是有效的PE文件,查看PE 结构,果然:
这个很明显是一段图片资源的字符串,使用html 进行显示:
打开后是一张二维码:
对二维码进行扫描得到字符串:
Bingo
这个题具有一定的迷惑性,会让人下意识的认为这个exe 文件是可以执行的,但是其实这个只是一个文本。
这里提供了一个reverse_3.exe 是可以执行的
让首先观察一下,这个题应该是要求输入正确的字符串,然后进行匹配,判断输入的字符串是否是正确的,那么顺着这个思路可以大致想到在程序内部肯定存在与目标字符串相关的字符串,而目标字符串可能就是flag ,也有可能是输入正确字符串后才会获取flag, 但是可以肯定的是程序内肯定存在一个与正确答案相关的字符串
然后对程序进行查壳:
无壳,然后进行调试:
这里我使用静态调试与动态调试相结合的方式进行调试:
x32Dbg:
查询一下字符串,查看输入错误是打印的那句:"wrong flag!"
从这里到达该函数的头部,绘制一下看看执行逻辑:
找到代码块后,使用IDA pro 看一下这里的伪代码,当然,建议先进行调试一下,看一下字符串的传递和处理是怎样的,对其有基本了解后,在看伪代码,更容易理解其加密算法:
这里是我分析的一些执行逻辑:
01035758 | 68 747B0301 | push reverse_3.1037B74 | 1037B74:"please enter the flag:" 0103575D | E8 CDBBFFFF | call reverse_3.103132F | 01035762 | 83C4 04 | add esp, 4 | 01035765 | 8D45 D8 | lea eax, dword ptr ss:[ebp-28] | 01035768 | 50 | push eax | 01035769 | 68 8C7B0301 | push reverse_3.1037B8C | 1037B8C:"%20s" 0103576E | E8 02BCFFFF | call reverse_3.1031375 | 01035773 | 83C4 08 | add esp, 8 | 01035776 | 8BF4 | mov esi, esp | 01035778 | 6A 28 | push 28 | 0103577A | 8D45 F4 | lea eax, dword ptr ss:[ebp-C] | 0103577D | 50 | push eax | 0103577E | 8D4D D8 | lea ecx, dword ptr ss:[ebp-28] | ecx 输入的字符串 01035781 | 51 | push ecx | 01035782 | E8 41B9FFFF | call reverse_3.10310C8 | 取出字符串长度 01035787 | 83C4 04 | add esp, 4 | 平栈 0103578A | 50 | push eax | 字符串长度 0103578B | 8D55 D8 | lea edx, dword ptr ss:[ebp-28] | 输入字符串地址 0103578E | 52 | push edx | edx:EntryPoint 0103578F | E8 2AB9FFFF | call reverse_3.10310BE | Base64 加密输入字符串 01035794 | 83C4 0C | add esp, C | 01035797 | 50 | push eax | 01035798 | 8D85 6CFFFFFF | lea eax, dword ptr ss:[ebp-94] | 0103579E | 50 | push eax | 0103579F | FF15 88B10301 | call dword ptr ds:[<&strncpy>] | 拷贝字符串到字符数组 010357A5 | 83C4 0C | add esp, C | 010357A8 | 3BF4 | cmp esi, esp | 010357AA | E8 78B9FFFF | call reverse_3.1031127 | 010357AF | 8D85 6CFFFFFF | lea eax, dword ptr ss:[ebp-94] | 010357B5 | 50 | push eax | 010357B6 | E8 0DB9FFFF | call reverse_3.10310C8 | 取加密前字符串长度 010357BB | 83C4 04 | add esp, 4 | 010357BE | 8985 60FFFFFF | mov dword ptr ss:[ebp-A0], eax | 010357C4 | C785 54FFFFFF 00000000 | mov dword ptr ss:[ebp-AC], 0 | 010357CE | EB 0F | jmp reverse_3.10357DF | 010357D0 | 8B85 54FFFFFF | mov eax, dword ptr ss:[ebp-AC] | 在这个循环内貌似也加密了字符串 010357D6 | 83C0 01 | add eax, 1 | 010357D9 | 8985 54FFFFFF | mov dword ptr ss:[ebp-AC], eax | 010357DF | 8B85 54FFFFFF | mov eax, dword ptr ss:[ebp-AC] | 010357E5 | 3B85 60FFFFFF | cmp eax, dword ptr ss:[ebp-A0] | 010357EB | 7D 23 | jge reverse_3.1035810 | 010357ED | 8B85 54FFFFFF | mov eax, dword ptr ss:[ebp-AC] | 010357F3 | 0FBE8C05 6CFFFFFF | movsx ecx, byte ptr ss:[ebp+eax-94 | 010357FB | 038D 54FFFFFF | add ecx, dword ptr ss:[ebp-AC] | 01035801 | 8B95 54FFFFFF | mov edx, dword ptr ss:[ebp-AC] | edx:EntryPoint 01035807 | 888C15 6CFFFFFF | mov byte ptr ss:[ebp+edx-94], cl | 0103580E | EB C0 | jmp reverse_3.10357D0 | 01035810 | 8D85 6CFFFFFF | lea eax, dword ptr ss:[ebp-94] | 01035816 | 50 | push eax | 01035817 | E8 ACB8FFFF | call reverse_3.10310C8 | 0103581C | 83C4 04 | add esp, 4 | 0103581F | 8BF4 | mov esi, esp | 01035821 | 50 | push eax | 输入字符串长度 01035822 | 68 34A00301 | push reverse_3.103A034 | 103A034:"e3nifIH9b_C@n@dH" 01035827 | 8D8D 6CFFFFFF | lea ecx, dword ptr ss:[ebp-94] | 0103582D | 51 | push ecx | 输入字符串进行某种加密后的字符串 0103582E | FF15 84B10301 | call dword ptr ds:[<&strncmp>] | 01035834 | 83C4 0C | add esp, C | 01035837 | 3BF4 | cmp esi, esp | 01035839 | E8 E9B8FFFF | call reverse_3.1031127 | 0103583E | 85C0 | test eax, eax | 01035840 | 74 0F | je reverse_3.1035851 | 01035842 | 68 947B0301 | push reverse_3.1037B94 | 1037B94:"wrong flag!\n" 01035847 | E8 E3BAFFFF | call reverse_3.103132F | 0103584C | 83C4 04 | add esp, 4 | 0103584F | EB 0D | jmp reverse_3.103585E | 01035851 | 68 4C7C0301 | push reverse_3.1037C4C | 1037C4C:"rigth flag!\n" 01035856 | E8 D4BAFFFF | call reverse_3.103132F |
使用IDA pro 打开软件,并且跳转到该代码区域
这里需要注意一个问题,该程序使用的动态基址,其地址会发生变动,所以可以将当前地址改写为reverse_3.exe + 偏移的形式
在IDA pro中,默认模块地址是0x00400000
按下F5 后便可以查看:
这里我解释一下这个程序的大致逻辑:
1、输入字符串
2、第一次加密(Base64)
3、第二次加密(字符值 + 该字符所在下标)
4、和正确的加密字符串比较,并输出结果
而从X32dbg 调试中,也发现了正确的加密字符串是:
e3nifIH9b_C@n@dH
按上面的逻辑进行解密:
当前字符串字符值 - 所在下标,即可得出Base64 字符串,在进行base64 解密
最后得出解密字符串:{i_l0ve_you}
bingo