拿到程序,首先查壳,进行黑盒测试,测试部分我这里跳过,可以看到是UPX压缩壳
由于程序加壳,PEID无法侦测到程序所用的编译器等信息,这里只能手动进行PE文件分析,可以看到Magic码为10B,说明这是个32位的程序(64位是20B),可以用OD来分析,压缩壳会动态的向区段解密数据,IDA是无法静态分析到这些未解密的数据,后面再说IDA的问题
用OD载入后可以看到是典型的UPX的EP,单步F8,可以看到ESP(栈顶指针)发生了变化,这里就可以用ESP定律来脱掉这个壳(ESP定律的原理是利用堆栈平衡来定位大跳转)
脱壳不是重点,这里就不演示具体的脱壳过程(不会百度ESP定律吧)
此处经过2次大跳转,来到标准的C++程序的OEP,如果逆向经验比较丰富,这里应该能看的出来
到达OEP之后,就可以正式开始逆向分析了
如果想用IDA进行分析,这时候直接把解码后的内存区段dump下来,然后用REC清理一下IAT的垃圾,重建一下IAT数据表(把IT指针改了,否则无法定位IAT),但是这个程序好像有内存保护,这里应该算是一个反调试吧,无法直接读取调试内存,所以REC不好使,用下面这个工具可以dump下来代码段和数据段,用IDA直接分析这2个区段就行。
搜索字符串,找到获取输入的关键点
由于题目已经告诉我们密钥是16位的,所以我就不演示踩坑的过程,直接输入16位的假码
继续跟踪,找到加密算法所在的函数(这里是我分析得出)
F7跟进去,看到这个程序的加密算法,过程看图即可
加密细节
这里可以推出数组是int类型的,每个元素占4个字节,分别为4 1 2 0 1 2 2 5 1 还原出C++代码应该是int a[9]={4,1,2,0,1,2,2,5,1}
这里面的算法就是把我们输入的每一位分别和刚才的数组对应的元素进行异或,然后加1
首先是x的ASCII对应的十六进制78和4进行异或得到7C,然后再加1得到7D
变换之后的7D替换第一个字符x
后面每一轮都是这样,循环加密,然后替换,值得注意的是,这里不是用了每一个数组元素,它会以5次为一个循环,也就是说,int a[9]={4,1,2,0,1,2,2,5,1}他只会循环4,1,2,0,1,用这5个数对字符串进行循环异或加1,然后替换
继续向下分析,找到程序最后会用我们加密之后的字符串和真码序列号4a88a2a653=97b2b 进行比较,判断的结果写到al中,al=1两个字符串匹配,al=0两个字符串不匹配
决定提示正确与否
整个程序到这里就分析完成,接下来开始逆推解密过程 我们已知最后对比的真码为4a88a2a653=97b2b ,程序正常运行会把输入进行异或然后加1,这里我们就把真码进行逆推变换,先减1,再异或 最后得出的7a57a5a743894a0e 输入到程序里进行验证,程序会把输入的7a57a5a743894a0e进行异或然后加1,变成4a88a2a653=97b2b,最后再和4a88a2a653=97b2b比较,这样肯定是正确的。 这就是EazyRe的完整解题过程,这是一道很简单的逆向题,相比于看雪CTF的题简直不值一提,这篇wp我写了3个多小时,非常详细,希望对刚入门逆向的朋友有所帮助吧。
题目和分析过程以及所用工具打包如下:
题目和分析过程以及所用工具.zip
(4.07 MB, 下载次数: 12)
|