思路:
拿到题目 使用exeinfo查看程序信息
是一个无壳32位程序
直接ida分析
v6
是sub_401160
函数的返回值
Text[v6] = 0
在c语言中字符串是以0结尾的 这里的意思是取v6
的值为字符串长度
查看sub_401160
函数的参数是Text
&unk_402008
28
双击&unk_402008
查看值
发现这是个数组
转换一下
是一个长度为176的数组
跟进sub_401160
函数查看
继续跟进sub_401000
函数
这个函数对Text
进行了操作
运行程序查看
发现程序消息框的内容正好是28位 也就是sub_401160
函数中的第三个参数 循环的次数
大胆猜想 每循环一次就处理一个&unk_402008
中的字符
&unk_402008
中有176个字符 去掉最后一位0 就是175分字符
我们只要把28次循环改成175次就可以得到flag
现在有两种解题思路
1.将程序的代码dump下来 将循环次数改成175
2.使用动调 直接将循环次数改成175
我选第二种方法(太懒了)
exp:
使用x32dbg打开程程序
发现内存地址和ida中的内存地址不一样
接下来计算偏移地址
找一个比较明显的特征
就这个push Output
在动调中搜索字符串
找到output双击进去
在动调中的内存地址为003E11EF
ida中的地址为004011EF
将这两个地址相减就是偏移地址了
在ida中找到push 1Ch
复制他的内存地址
在动调中跳转到这个地址-20000
右键这个地址->在内存窗口中转到->选定的地址
右键这个1C
->修改
修改成AF(十进制的175)
按f9运行程序