好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 shavchen 于 2019-4-28 21:39 编辑
<!-- TOC -->
分析题目
-
直接运行
-
题目简介
目的:点亮所有的lamp(台灯)
输入lamp编号(m),则该lamp变亮,同时(m-1)和(m+1)的lamp亮暗状态会变化
输入多次m,最后将lamp全部点亮,游戏过关
-
先玩玩
输入2,结果为
输入5,结果为
输入8,结果为
尝试多次,无法将所有灯全部点亮
初步确认无法手工破解后,默默打开IDA和OD
查壳脱壳
-
使用exeinfo查壳工具
此程序无壳
IDA静态分析
-
搜索字符串(shift+F12)
发现明显暗示:done!!!the flag is
这可能就是成功游戏过关后,显示flag字符串
意味着我们只要让程序执行到这个位置,就可以获得flag了
-
双击查看该字符串的内存地址
变量位于只读数据区(rdata)
-
查看该字符串变量的交叉引用地址
设置显示行前缀地址(Option-General-Display-Line Prefix)
按X 键定位变量的交叉引用地址
发现进栈地址:0x0045E940 ,这里需要记住偏移地址E940 ,下面使用OD直接非常规 执行到该地址
OD动态调试
总结
-
调试几乎所有的Windows程序,将IDA和Olldbg联合使用,将起到事半功倍的效果
-
解题的第一步,需要理清题目想要干什么,运行并研究程序本身的运行流程和提示是必要的
-
IDA调试程序找到关键变量的偏移地址,再使用OD调试,是一种常见的调试手段
-
本程序使用了jmp指令,通过中断 可以控制的程序语句,跳转到正常情况下不可以到达 的flag语句位置,从而获得flag,是一个很棒的思路
-
掌握OD中执行程序,设置断点,跳出循环的基本操作
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|