新手的第一个迷宫逆向
最近在学习逆向,从bugku上下了几个题目学习,地址:https://ctf.bugku.com/challenges -take the maze
参考WP:
https://www.cnblogs.com/reddest/p/10121550.html
https://www.52pojie.cn/forum.php?mod=viewthread&tid=674404&page=1&authorid=666114
https://www.cnblogs.com/sweetbaby/p/10920746.html
过程总结:
1、先放进exeinfo里看有没有壳
2、放到IDA里进行反编译
先是用了6.8版本的
打开exe后发现要求输入key之类的,于是搜索关键字’key’和’flag’,发现了两处关键代码
可以看到是会生成一个文件,文件里会有flag的相关信息
这个是主函数
问题1:一开始主函数无法F5伪代码,提示是sp问题
解决:搜索问题后,使用Alt+k进行平衡堆栈,平衡了几次之后就可以F5了
参考:https://www.cnblogs.com/echo579/p/6236277.html
https://blog.csdn.net/wangtiankuo/article/details/81632375
https://blog.csdn.net/wjcsharp/article/details/11075993
问题2:分析的时候奇怪为什么别人的IDA比我的智能,能分析出更多函数,然后发现可能是符号表的问题,折腾了很久还是没有成功
解决:直接选择了7.0版本,发现加载文件的时候就自动导入一些符号表了,也不用平衡堆栈,可以开始分析函数
逐行理解,代码中有两个和V4紧密相关的函数:sub_45C748和sub_45E593
跟入进行操作的sub_45C748函数,非常复杂,得知是VM处理,无法分析,这里需要用OD进行动态调试判断
跟进sub_45E593函数
然后进入d的函数,sub_45CC4D
逐行理解,确定地图范围和起始和终点位置
然后学习了如何使用IDC脚本生成地图,显示的字符代表可以行走的方向
IDC脚本:
auto i;
for(i = 0;i <= 311; ++i){
if(Dword(0x540548 + i * 4) ^ Dword(0x540068 + i * 4))
Message(".");
else
Message("D");
if(Dword(0x5404DC + i * 4) ^ Dword(0x53FFFC + i * 4))
Message(".");
else
Message("L");
if(Dword(0x5404E4 + i * 4) ^ Dword(0x540004 + i * 4))
Message(".");
else
Message("R");
if(Dword(0x540478 + i * 4) ^ Dword(0x53FF98 + i * 4))
Message(".");
else
Message("U");
Message(" ");
if(!((i + 1) % 26))
Message("\n\n");
}
return 0;
dump出迷宫地图
drdddrdrrrrrrdddrrrrddrrrrrrrrrdrrrr
接下来对路线进行操作,方向+步数,得到字符串:
d1r1d3r1d1r6d3r4d2r9d1r4
接下来转换,查看字符数组的内容
64h就是d
解得:06360836063b0839073e0639
但是这段字符串依旧不是正确答案,之前无法分析的那个函数还对这串字符串进行了操作
根据OD中动态调试得知是异或操作,脚本编写
a = list("06360836063b0839073e0639")
a[16] = chr(ord(a[16]) ^ 1)
for i in range(24):
print chr(ord(a[i])^i)
即可获得正确答案