首页
社区
课程
招聘
[分享]第6题 RePWN
发表于: 2019-3-14 13:55 5782

[分享]第6题 RePWN

2019-3-14 13:55
5782

随意输入brucy1998416,得到输出
图片描述
IDA载入,搜索关键字符串,定位到关键函数

动态调试发现v5解密出来的数据为Flag{Th3_K3y_I5_N0t_Rea11Y_K3y},这在后面的分析中没看到有什么用,算是个彩蛋吧。

check2函数要求输入的字符串中从第8位开始到第20位要与“X1Y0uN3tG00d”相等,并且第21位字符为‘H’

要求输入的字符串长度是24位,跟进check4看看

可以看出,两个if语句表示着一个三元一次方程组:

2 (v1 + v2) = 4040
3
v2 / 2 + 100 v3 = 115
v1 - 110
v3 = 1900
解之得
[v2 = 10, v3 = 1, v1 = 2010]

CharToInt函数是将输入的数据前8位依次减去48,保存在input数组里。
根据解得的v2,v3,v1可以逆推出输入的前8位数据为“20101001”
现在回到check3中

Str[20] -= 88;
Str[21] -= 70;
Str[22] -= 3;
Str[23] -= 107;
strcpy(&Dest, Str);

这里是对输入的后4位进行处理,然后很诡异的一个地方就是最后用了一个 strcpy(&Dest, Str);

到此就不得不吐槽一下,这道题目已经修改了两次。我是在他修改的第一次后开始做的,当时没明白这里有什么用,随意输入1234凑足24位。即将“20101001X1Y0uN3tG00d1234”作为输入,程序没有错误提示,且正常退出,然后提交答案却说错误。过了一段时间提示题目更新,修正多解bug。

拿到最后更新的题目,也就是上面给出的代码。当再将“20101001X1Y0uN3tG00dH234”作为输入发现程序崩溃了。

琢磨这这道题的题目“Repwn”,定是Reverse+pwn。一定是溢出到某个地方让程序提示正确信息。为了验证我的猜想,我用OD动态调试了一下,执行到
strcpy(&Dest, Str)之前,堆栈数据
图片描述
继续走~
图片描述
图片描述

得知输入的后4位经过运算后,作为返回地址。接下来要跳去哪呢?
回到IDA,找遍了有用的字符串,还是没有弄清楚。然后就用脚本分析了一下可能存在的算法,得知存在DES加密!看来没那么简单!
图片描述

迅速定位,不断地追溯调用来源,一直走到头
图片描述

图片描述

没错,就是这里了!“断了的桥”,要跳转到的地址是0x00401BF0,注意小端序,逆回去就得到了后四位是“HaCk”

将“20101001X1Y0uN3tG00dHaCk”输入程序中我们来到了另一片天地

之前没怎么看过DES加密,上网恶补了一番后。勉强逆出来了

猜测可能用的是ECB模式的DES加密,因为并没有初始IV。从内存中dump v12下来,编写脚本


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-3-25 13:33 被kanxue编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 1258
活跃值: (41)
能力值: ( LV3,RANK:22 )
在线值:
发帖
回帖
粉丝
2
我就卡在字符串后三位"aCk"这里死活过不去
2019-3-25 22:04
0
雪    币: 3985
活跃值: (64)
能力值: ( LV4,RANK:41 )
在线值:
发帖
回帖
粉丝
3
我是没看清大规则,flag只允许数字和字母
结果我得到了个200:1001X1Y0uN3tG00dHaCk;
后面没识别DES,Input2没逆出来,顺着对4085B0跟了几轮就晕了,只是根据最后的比较,推出是个8为的字符串
看结果好多只要做出Input1就能过,还有这操作
2019-3-26 10:06
0
游客
登录 | 注册 方可回帖
返回
//