转自:https://xz.aliyun.com/t/3613
这是我在自学二进制逆向过程中遇到的一道题目,为了学习和成长,和大家一起分享!
题目在附件那里,接下来一起看看吧。
首先win.exe拿进去看,运行:
看来可以拖进去ida(提示是32位,自己可以尝试)
拖进去,优先找main函数,按F5:
对的,很好,接下去分析,
看到congratulation!
说明这里是关键函数,所以V3是我们的关键数字,要不能为空,找到V3的出处。那个sub-401610那里,进去:
我们猜测,用户肯定有输入的,所以这个a1应该是传进来的外部参数
所以,我们可以判断出这里就是有比较的,看到一串可疑的字符串:
感觉很像是flag的样子,所以这个函数要装载字符串?(猜测)
进去看看:
result是要返回的值,a3是我们要处理的字符串,V5是最后一个字符的地址,它和sub_44B160有关系,所以进去看看:
我们看到一个memcpy函数,是说把a3地址开始的数据复制到V5,V5=v3+12开始的数据,数据长度是v2,v2=v5_1-a3;
v2就是我们能知道的字符串的长度,所以就是copy全部(当然这里是可选的长度,说不定下次就是一半呢,哈哈(暗示可以自己修改算法代码)),这样就明朗了,V5就是copy到的寄存器,出来吧:
v4是存下来了,而V4的首地址刚好就是a1,再回去:
a1的地址就是V11的地址呀,所以,V11就是存储字符串的地址,很好,接下来继续分析:
看到这个函数,对V11和a1进行处理了,所以我们推断a1是用户输入进来的,V11刚分析了一波,是我们的字符串,说明是有股匹配在里面,V11和a1是两股势力
我们从头开始分析,
这是判断V3和a1的前12位地址的内容,
不行同则调到label—24那里,后面的也是,label—24是什么,我们看看:
讲V4=0,很明显:
返回的是V18,而v18在label—24中是恒为0的,因为v4是0,
所以这个函数是我们要避免的,不能跳到这个坑里面,所以继续分析:
问发现426810函数就是一直在用的函数,它对a1和V11都是进行了相同的操作,所以我们进去看:
发现了关键函数,substr,这是个剪切字符串的函数,substr(a,b,c)表示a字符串从b处开始剪切c长度的字符串;
回去看看一个具体的分析:
我们发现了东西,a1从8处开始剪长度为6的字符串放到V12,V11从0处开始剪辑长度为6的字符串放到v13,然后比较V13和V12的内容,不相等则跳到label-24(就是前面那个坑!),所以以此类推:
这段代码就读懂了 !
最后全部匹配完成,成功的话,V4=1,就是V3的值=1;
接下来,我们就是要把剪辑的东西还原出来了!
对V11进行操作啦!来个python脚本:
我们去看看对不对!
程序闪退了,说明正确!
好啦,脚本搞出来了,接下来,题目还提示拼拼拼!前面不是还有2018吗?所以答案就是:flag{2018reverse_1s_very_easy}!
这就是全部过程啦,这道题还是很有收获的,首先是第一个substr函数的用法!切片(任意切!),第二个就是对于整体的把握和认知,程序明白了,一切都好办了~本题的匹配是将输入切片和答案的切片进行匹配,通过切片达到保护作用!