Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup
第六题:Repwn
PEiD查壳,无壳 直接载入IDA shift+f12分析字符串
sub_4014C0()分析如下:
sub_4012F0()可以得到flag的第8-19位是X1Y0uN3tG00d,第20位是H
双击进入sub_401460()
可以先分析sub_4013B0
sub_4013B0取输入第一部分前8个字符按aaaabbcc转为整数, 校验是否满足方程组(aaaa + bb) * 2 == 4040 && (3 * bb / 2) + (100 * cc) == 115 && aaaa - 110 * cc == 1900
这里可以用z3求解
from z3 import *
aaaa = Int('aaaa')
bb = Int('bb')
cc = Int('cc')
s = Solver()
s.add(aaaa>0,aaaa<10000)
s.add(bb>0,bb<100)
s.add(cc>0,cc<100)
s.add((aaaa + bb) * 2 == 4040)
s.add((3 * bb / 2) + (100 * cc) == 115)
s.add(aaaa - 110 * cc == 1900)
m = s.model()
print(m[aaaa].as_long())
print(m[bb].as_long())
print(m[cc].as_long())
求得20101001
这里如果不明白 可以结合sub_401380()进行理解
实现了atoi函数 将前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
#2 0 1 0 1 0 0 1
OD进行动态调试 输入20101001X1Y0uN3tG00dHF3k
局部变量buf长度为0x14,因此会造成栈溢出,恰好flag后四位会覆盖返回地址
由于flag[20]='H', flag[20]-'X'=0xf0,考虑到小端序,所以只能选地址对齐0xf0的函数
这里还可以根据查找字符串引用来确定
也可以用所有的进行验证 要注意字节溢出 高位舍去
F0 1B 40 00
+ 58 46 03 6B
--------------
48 61 43 6B
H a C k
得到20101001X1Y0uN3tG00dHaCk
接着就是再次获取输入 sub_401730()与sub_4018b0() 将XiyouNet作为key值把我们的输入进行DES加密
最后与给定的密文进行比较 验证是否一致
我们可以直接使用IDC脚本提取密文
最后编写python脚本进行DES解密或者使用PYG密码学工具即可:
from Crypto.Cipher import DES
des = DES.new('XiyouNet')
s = '9db084ac97041e30'.decode('hex')
print(des.decrypt(s))
#Wel1C0me
最后的flag是input1+input2
也就是20101001X1Y0uN3tG00dHaCkWel1C0me
参考链接: