题目在这里面找
https://down.52pojie.cn/Challenge/Happy_New_Year_2019_Challenge.rar
内容方面参考论坛上的文章,并做了一些补充
https://www.52pojie.cn/thread-874670-1-1.html
按照习惯,先查壳。发现应该是upx壳。
用od打开,现在可以看到程序的入口,从这也可以发现入口的特征确实为upx壳的特征。
所以此处可以尝试使用“esp定律”来进行脱壳
具体方法为:
1.先od加载程序chunjiekuaile.exe,此时自然就到了程序的入口点,发现pushad
2.这时F8单步执行一步,然后可以看到寄存器区域的esp反色高亮
3.此时我们在esp高亮处点击右键 ->选择HW break[ESP],即可下一个硬件断点
插一句,这里也可使用另一种方式下断点,效果是一样的。在高亮处,右击选择“数据窗口中跟随”。
然后在数据窗口中右键,选择 "断点" -> "硬件访问“ -> "byte"(其他两个也都行)
4.这里可以打开,”调试“->"硬件断点",来进行查看断点是否下成功
5.接下来F9运行程序,然后我们可以看到程序断在了第一行那里,按照规律最下面的jmp,将带领我们跳至oep,也就是程序真正的入口,我们可以在那行用F4,直接运行到选定位置,然后再F8单步执行一次
6.此时就来到了正真的程序入口点,可以看到程序入口点OEP的特征和通常的Microsoft Visual C++ 6.0的OEP特征非常相似,所以这时我们可大致断定我们找到了OEP
7.这时我们在OEP处右键选择“用ollydump脱壳调试进程”
8.然后不要勾选重建输入表,其他按照默认配置,点击脱壳,然后保存就好,我们这里保存为chunjiekuaile2.exe
9.脱出来的程序需要重建输入表,我使用的ImpREC进行重建,运行程序加载脱出来的程序,点击IAT AutoSearch->Get Imports->Fix Dump
点击fix Dump打开被修复的程序,会生成一个新的chunjiekuaile2_.exe
9.这时再把我们保存的chunjiekuaile2_.exe拖入PEID中,检查是否已经把壳脱掉,结果可发现已经没有了壳,此时我们就可以大胆得开始调试程序了
10.将脱完壳的程序拖入od中,F9运行起来,现在就开始猜密码了,随便输几个数字,发现会提示“长度错误”
11.按照老套路,右键选择“中文搜索引擎”->“智能搜索”
12.可以发现,运气很好,搜索到了相关字符,双击跳转至该处
13.向上看到这行,发现这里有一个获取字符串长度的操作,然后接下来就是一个cmp指令,那我们基本可以猜测这里就是校验字符串长度的地方。由于是和十六进制0x10进行比较,也就是十进制的16,所以我们可以尝试使用十六位的字符进行测试
14.这时我们可以发现,已经通过了长度的校验,提示变成了“内容错误”
15.还是之前的套路,我们继续搜索字符串,发现也可以找到相关的字符串,双击转到该处,F2下一个断点
16.我们再往上看,发现有惊喜,发现了“正确”的字样,那么我们可以猜测最终校验密码的代码就在附近
由于之前基本确定在00401288那行应该就是最终成功的提示,所以我们可以做出推断,往这行指令之后的跳转,基本都要避免,比如00401281的这个jnz。那么接下来任务就是要看再怎样的条件才可使指令最终一步一步执行到这里
17.大胆猜想一下,上面的flag应该是进行了一些变换所以才和正真的flag有差别,那现在我们暂定分析范围在,之上的疑似flag那,到正确提示之间。于是先在004011FF那下个断点进行调试
18.按照我们的猜想,字符串一定是经过与正确的字符串进行比较才能完成校验,于是我们可以着重关注一下如cmp之类的比较类的指令。我们一步步单步来跟,发现在经过004010E0 => call chunjiek.004010E0,之后ESI和EDI之中的分别为我们的测试字符串"TESTbNhzYhdu2019"和另一串长度相同的字符串。而且接下来的各类比较都是围绕着这两个寄存器来展开的,所以我们可猜测EDI中的字符就是要找的flag。最快速的方法就是使用这个字符串再测试一下,发现通过了校验,正是我们要找的flag。