默小白 发表于 2019-1-31 16:21

逆向破解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函数的用法!切片(任意切!),第二个就是对于整体的把握和认知,程序明白了,一切都好办了~本题的匹配是将输入切片和答案的切片进行匹配,通过切片达到保护作用!

大梦初醒 发表于 2019-1-31 16:57

感谢分享

wang254925 发表于 2019-1-31 18:33

看不懂只吃了支持几

onmiuncai 发表于 2019-1-31 19:20

分析的很不错,学习学习。{:1_919:}

KOAKIE 发表于 2019-1-31 19:44

很强,学到了

拂晓江南 发表于 2019-1-31 20:18

学习了.笑嘻嘻

gunxsword 发表于 2019-1-31 21:10

感谢分享,现在看IDA的代码....还是如OD的代码来的得劲...IDA还是要好好学一学!

PriceXiao 发表于 2019-1-31 22:29

看的迷迷糊糊,逆向工具没有过,但是还是非常佩服楼主有耐心

dafs 发表于 2019-2-1 08:05

学习了 谢谢啦

erh 发表于 2019-2-1 09:50

谢谢!辛苦啦!
页: [1] 2
查看完整版本: 逆向破解win.exe——磨砺提高逆向能力