破解程序需要先查看程序运行的过程找出关键的字符串进行破解
玩个游戏
n为灯的序号,m为灯的状态
如果第 N 个灯的 m 为 1,则点亮,否则熄灭
起初所有的灯都关上了
现在你可以输入 n 来改变它的状态
但是你要注意一件事,如果你改变第N个灯的状态,第(N-1)个和第(N+1)个的状态也会改变
当所有灯都亮时,会出现flag
现在,输入 n
输入 n,n(1-8)
1.△ 2.○ 3.◇ 4.□ 5.☆ 6.▽ 7.( ̄▽ ̄)/ 8.(;°Д°) 0.重启
n=
要是我来写这个程序的话我会每次输入之后都会判断一下这8个是不是都连起来了,可以设置0是没有连接,1是连接,如果8个都是1就会出现flag否则就是轮回了。
没有加壳,直接OD动态调试
查看一下字符串有没有敏感的关键词
找到了flag的提示地方双击进去
下个断点,记下位置009ce968
在输入完数字之后下断点逐步运行查看
动态调试:
先判断是不是1-8的数字不是就提示sorry,n error,try again\n否则就跳转
这里跳转执行成功
进入清屏
关键就是这里了,这里会逐个判断具体是怎么判断的没有细看,但是如果ZF标志位为0。Jnz跳转执行就会调到标记轮回的位置,而这里是jmp无条件跳转,跳转到重新输入的地方直到8个灯都连接才行,所以我将这里的jnz全部改为jz,jnz跳转依据:zf=0跳转,jz是zf=0 不跳转;并且把jmp无条件跳转使用nop填充;
直接来到了flag显示的地方,直接f9出现flag
把刚刚修改的地方保存下来另存到破解版文件,就是暴力破解的操作了。zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}