Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

第六题:Repwn

PEiD查壳,无壳  直接载入IDA  shift+f12分析字符串

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

sub_4014C0()分析如下:

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

sub_4012F0()可以得到flag的第8-19位是X1Y0uN3tG00d,第20位是H

双击进入sub_401460()

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup可以先分析sub_4013B0  

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

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()进行理解

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

实现了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

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

局部变量buf长度为0x14,因此会造成栈溢出,恰好flag后四位会覆盖返回地址

由于flag[20]='H',  flag[20]-'X'=0xf0,考虑到小端序,所以只能选地址对齐0xf0的函数

这里还可以根据查找字符串引用来确定

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

也可以用所有的进行验证    要注意字节溢出 高位舍去

  F0 1B 40 00
+ 58 46 03 6B
--------------
  48 61 43 6B
   H  a  C  k

得到20101001X1Y0uN3tG00dHaCk

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

接着就是再次获取输入    sub_401730()与sub_4018b0()   将XiyouNet作为key值把我们的输入进行DES加密

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

最后与给定的密文进行比较 验证是否一致

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

我们可以直接使用IDC脚本提取密文

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

最后编写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

Kanxue看雪KCTF2019-Q1第六题【Repwn】Writeup

参考链接:

https://bbs.pediy.com/thread-250242.htm

https://bbs.pediy.com/thread-250229.htm