-
-
[原创]第六题 Repwn Writeup
-
2019-3-20 16:38 2502
-
第六题 Repwn Writeup
Step 1-1
载入IDA,Shift + F12 查找关键字符串
双击进入关键函数,
分析后知,sub_4012f0为第一步的验证函数,跟进
经过分析知,flag的下标从8到20为X1Y0uN3tG00d
Step 1-2
跟进sub_401460函数,
分析易知,输入字符长度为24,但是没有前8位的信息,进一步分析,进入sub_4013B0函数,
发现,函数中出现8个连续的全局变量运算,猜测input的前8位应该赋值给了全局变量,进入sub_401380验证
很明显的atoi函数,则结合对sub_4013B0函数分析,发现是对前8位的输入进行了限制,根据函数写脚本
for one in xrange(0,10): for two in xrange(0,10): for three in xrange(0,10): for four in xrange(0,10): for five in xrange(0,10): for six in xrange(0,10): for seven in xrange(0,10): for eight in xrange(0,10): v1 = 1000 * one + 100 * two + 10 * three + four v2 = 10 * five + six v3 = 10 * seven + eight if v1 + v2 == 2020 and 100 * v3 + 3 * v2 / 2 == 115 and v1 - 110 * v3 == 1900: print one,two,three,four,five,six,seven,eight
得到输入前8位为20101001
Step 1-3
继续,进一步分析,发现无论怎么找,都无法找到对输入最后四位的验证,而只有对后续四位的减法运算
input[20] -= 0x58; input[21] -= 0x46; input[22] -= 3; input[23] -= 0x6B; strcpy(&Dest, input);
进一步考虑溢出的问题,发现最后的strcpy函数将我们的输入拷贝到局部变量dest中,而就是input的最后四字节造成函数返回地址被覆盖,
于是,寻找合适的返回地址,后续发现一个很可疑的函数sub_401BF0,构造最后四个字符,使函数执行完后,返回到0x401bf0,考虑到小端序的问题,并且字节溢出高位舍去的问题
F0 1B 40 00 + 58 46 03 6B -------------- 48 61 43 6B H a C k
运行发现出现新窗口
最终得到flag的最后四位为HaCk
Step2
分析后续函数sub_401BF0
发现有个很奇怪的strcpy,继续跟进函数sub_401730和sub_4018b0,发现其中有几个很明显的已知加密函数特征,使用PEiD的插件查询是否有已知加密函数
查看地址0x401893,验证成功,那么上述strcpy的字符串,应该就是des的密钥,继续分析函数,在最终sub_4018B0中进行了比较
最终得到密文应为9db084ac97041e305697d5a499355a28
解密得
flag得第二部分为Wel1C0me
end
最终提交得flag为20101001X1Y0uN3tG00dHaCkWel1C0me
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。