好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 pipiji233 于 2023-2-7 21:16 编辑
查壳
好的,并没有加壳
调试
启动
正常启动程序如上图所示,常见的C/C++中的字符串输入有如下函数
scanf():通过格式控制符%s输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
scanf_s():与scanf()功能相同的安全标准输入函数
gets():直接输入字符串,并且只能输入字符串。
对上面所有函数下断点,然后输入假码
假码
好的,很可惜,一个都没断下…
那就搜索字符串吧
字符串
按照错误提示来到Length Error, please try again
粗略的分析一下
1
再来
这次先随机生成29个字符
2
3
按照第二个提示进入Wrong,please try again.
4
有个跳转,跟过去看看
5
发现了跳转成功,下个断点
6
我们输入的内容不正确,所以跳转了
7
我们看看00401417信息窗口中的内容
8
我们输入的密码是
YTQXTDfagGa1C4zGgBLZceEIdsu8m
而信息窗口告诉我们的是第一个不是”Y”而是”f”
那么我们就可以利用这一点来拼接密码
而0040141A的JNE是为真不跳,所以我们这里就不能让他跳过
将寄存器中的ZF改为1阻止跳过
9
当来到00401429时循环回了004013F0
10
由此猜测只有29位的问题答案完全通过对比才能跳出循环
而每次的对比都可以在信息窗口中找到
那么我们只需要将0040141A给NOP掉,然后查看信息窗口即可。
在00401417这下入断点,查看后续的对比
A
B
C
E
F
G
K
L
J
N
M
2
2
3
A
P
P
Y
N
E
W
Y
E
A
R
}
当全部对比结束后就跳转到成功
END
根据对比,拼接得到密码: flag{52PoJie2023HappyNewYear}
|
免费评分
-
参与人数 2 | 威望 +1 |
吾爱币 +21 |
热心值 +2 |
收起
理由
|
机制呆萌的我
| |
+ 1 |
+ 1 |
用心讨论,共获提升! |
Hmily
| + 1 |
+ 20 |
+ 1 |
感谢发布原创作品,吾爱破解论坛因你更精彩! |
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|