题目说是maze, 看到step_2的判断, 四个方向100, 115, 119, 97, 分别对应字母dswa, v10是竖直位置, v9是水平位置, 最后congratulations的判断条件是v10 == 6 && v9 == 6
, 所以预测是在maze中走到[6,6]的位置就算成功. v10, v9, v8开始均为0, 所以是从[0,0]开始走, 并且每一步都要走在(*a1)[7 * v10 + v9] == 1
上. 可以判断这是一个7 * 7的maze, 只有1是可行的位置, 而且必须在30步以内走到目标位置[6,6].
尝试静态分析step_0和step_1, 发现step_1的处理过程有嵌套调用getA和getAStart函数, 流程比较复杂, 静态分析会很困难, 但我们不需要知道具体是如何处理maze数组的, 只需要拿到处理后的maze即可, 所以可以动态调试, 断点到maze数组处理完成的位置, 然后dump出来maze数组数据, 就可以找到在maze中的移动序列.
用IDA远程调试, Remote Linux Debugger, 在Ubuntu虚拟机上运行程序, 调试界面在IDA
IDA目录下的dbgsrv文件夹, 把linux_server[64]复制到Ubuntu
sudo chmod +x linux_server64
sudo chmod +x linux_server
sudo chmod +x easy_Maze
./linux_server64
断点到step_2
, 这时maze已经处理完成, 在内存中dump出来就是需要的迷宫数组.
设置synchronize with Hex View - I, 这样可以同步查看stack栈内存的数据和内存16进制窗口的数据, 另外设置Hex View的查看data format为4bytes, 这样是看一个整数类型(4字节)的形式. 注意这里要复制Hex View窗口的数据, stack窗口的数据是byte形式显示的.
maze = [1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1]
for i in range(0, 7):
for j in range(7):
print(maze[i * 7 + j], ' ', end='')
print()
序列串是ssddwdwdddssaasasaaassddddwdds
总结
IDA远程调试get!