逆向破解win.exe——磨砺提高逆向能力
转自:https://xz.aliyun.com/t/3613这是我在自学二进制逆向过程中遇到的一道题目,为了学习和成长,和大家一起分享!
题目在附件那里,接下来一起看看吧。
首先win.exe拿进去看,运行:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163510-2b159ce0-ff7b-1.png)
看来可以拖进去ida(提示是32位,自己可以尝试)
拖进去,优先找main函数,按F5:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163544-3f2e06e0-ff7b-1.png)
对的,很好,接下去分析,
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163610-4f2f409a-ff7b-1.png)
看到congratulation!
说明这里是关键函数,所以V3是我们的关键数字,要不能为空,找到V3的出处。那个sub-401610那里,进去:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163647-64cf41c0-ff7b-1.png)
我们猜测,用户肯定有输入的,所以这个a1应该是传进来的外部参数
所以,我们可以判断出这里就是有比较的,看到一串可疑的字符串:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163658-6b7648c0-ff7b-1.png)
感觉很像是flag的样子,所以这个函数要装载字符串?(猜测)
进去看看:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163710-72ccc978-ff7b-1.png)
result是要返回的值,a3是我们要处理的字符串,V5是最后一个字符的地址,它和sub_44B160有关系,所以进去看看:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163731-7f496c06-ff7b-1.png)
我们看到一个memcpy函数,是说把a3地址开始的数据复制到V5,V5=v3+12开始的数据,数据长度是v2,v2=v5_1-a3;
v2就是我们能知道的字符串的长度,所以就是copy全部(当然这里是可选的长度,说不定下次就是一半呢,哈哈(暗示可以自己修改算法代码)),这样就明朗了,V5就是copy到的寄存器,出来吧:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163756-8e1e08ea-ff7b-1.png)
v4是存下来了,而V4的首地址刚好就是a1,再回去:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163805-93b2d038-ff7b-1.png)
a1的地址就是V11的地址呀,所以,V11就是存储字符串的地址,很好,接下来继续分析:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163813-983977ec-ff7b-1.png)
看到这个函数,对V11和a1进行处理了,所以我们推断a1是用户输入进来的,V11刚分析了一波,是我们的字符串,说明是有股匹配在里面,V11和a1是两股势力
我们从头开始分析,
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163821-9d02ac94-ff7b-1.png)
这是判断V3和a1的前12位地址的内容,
不行同则调到label—24那里,后面的也是,label—24是什么,我们看看:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163829-a1d0f35c-ff7b-1.png)
讲V4=0,很明显:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163839-a80872cc-ff7b-1.png)
返回的是V18,而v18在label—24中是恒为0的,因为v4是0,
所以这个函数是我们要避免的,不能跳到这个坑里面,所以继续分析:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163849-ad9cf1ea-ff7b-1.png)
问发现426810函数就是一直在用的函数,它对a1和V11都是进行了相同的操作,所以我们进去看:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163856-b1afbb3c-ff7b-1.png)
发现了关键函数,substr,这是个剪切字符串的函数,substr(a,b,c)表示a字符串从b处开始剪切c长度的字符串;
回去看看一个具体的分析:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163906-b7ba9146-ff7b-1.png)
我们发现了东西,a1从8处开始剪长度为6的字符串放到V12,V11从0处开始剪辑长度为6的字符串放到v13,然后比较V13和V12的内容,不相等则跳到label-24(就是前面那个坑!),所以以此类推:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163920-c02bcb4c-ff7b-1.png)
这段代码就读懂了 !
最后全部匹配完成,成功的话,V4=1,就是V3的值=1;
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163930-c5f95e18-ff7b-1.png)
接下来,我们就是要把剪辑的东西还原出来了!
对V11进行操作啦!来个python脚本:
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163938-cadb1426-ff7b-1.png)
![](https://xzfile.aliyuncs.com/media/upload/picture/20181214163950-d219566c-ff7b-1.png)
我们去看看对不对!
程序闪退了,说明正确!
好啦,脚本搞出来了,接下来,题目还提示拼拼拼!前面不是还有2018吗?所以答案就是:flag{2018reverse_1s_very_easy}!
这就是全部过程啦,这道题还是很有收获的,首先是第一个substr函数的用法!切片(任意切!),第二个就是对于整体的把握和认知,程序明白了,一切都好办了~本题的匹配是将输入切片和答案的切片进行匹配,通过切片达到保护作用!
感谢分享 看不懂只吃了支持几 分析的很不错,学习学习。{:1_919:} 很强,学到了 学习了.笑嘻嘻 感谢分享,现在看IDA的代码....还是如OD的代码来的得劲...IDA还是要好好学一学! 看的迷迷糊糊,逆向工具没有过,但是还是非常佩服楼主有耐心 学习了 谢谢啦 谢谢!辛苦啦!
页:
[1]
2