思路:

拿到题目 使用exeinfo查看程序信息

是一个无壳32位程序

image-20230407103641150.png
image-20230407103641150.png

直接ida分析

v6sub_401160函数的返回值

Text[v6] = 0 在c语言中字符串是以0结尾的 这里的意思是取v6的值为字符串长度

查看sub_401160函数的参数是Text &unk_402008 28

image-20230407110654182.png
image-20230407110654182.png

双击&unk_402008查看值

发现这是个数组

image-20230409194556653.png
image-20230409194556653.png

转换一下

是一个长度为176的数组

image-20230409194644102.png
image-20230409194644102.png

跟进sub_401160函数查看

image-20230409194415881.png
image-20230409194415881.png

继续跟进sub_401000函数

这个函数对Text进行了操作

image-20230409195258303.png
image-20230409195258303.png

运行程序查看

发现程序消息框的内容正好是28位 也就是sub_401160函数中的第三个参数 循环的次数

大胆猜想 每循环一次就处理一个&unk_402008中的字符

&unk_402008中有176个字符 去掉最后一位0 就是175分字符

我们只要把28次循环改成175次就可以得到flag

image-20230409200207447.png
image-20230409200207447.png

现在有两种解题思路

1.将程序的代码dump下来 将循环次数改成175

2.使用动调 直接将循环次数改成175

我选第二种方法(太懒了)

exp:

使用x32dbg打开程程序

发现内存地址和ida中的内存地址不一样

image-20230409201225904.png
image-20230409201225904.png

接下来计算偏移地址

找一个比较明显的特征

就这个push Output

image-20230409201607101.png
image-20230409201607101.png

在动调中搜索字符串

image-20230409201800012.png
image-20230409201800012.png

找到output双击进去

image-20230409201844690.png
image-20230409201844690.png

在动调中的内存地址为003E11EF

ida中的地址为004011EF

将这两个地址相减就是偏移地址了

image-20230409202108436.png
image-20230409202108436.png

在ida中找到push 1Ch

复制他的内存地址

在动调中跳转到这个地址-20000

image-20230409202254106.png
image-20230409202254106.png

image-20230409202454745.png
image-20230409202454745.png

image-20230409202508746.png
image-20230409202508746.png

右键这个地址->在内存窗口中转到->选定的地址

image-20230409202557852.png
image-20230409202557852.png

右键这个1C->修改

image-20230409202735076.png
image-20230409202735076.png

修改成AF(十进制的175)

image-20230409202837372.png
image-20230409202837372.png

按f9运行程序

image-20230409203006505.png
image-20230409203006505.png

flag:

flag{I_a_M_t_h_e_e_n_C_o_D_i_n_g@flare-on.com}