随意输入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编辑
,原因: