CTF-RE-JustRE (2019第三届强网杯)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/getsum/article/details/90580743

首先IDA点开进行静态分析:

发现判断函数sub_401610,点进去看之后发现很长一串……前面比较好说,是将前8位字符变hex放入eax寄存器中 ,第9,10位变hex放入ch(还是dh?)中

然后再往下面拉,可以看到很多SSE指令集,但是不是很复杂,网上可以搜到,发现都是一些比较基础数位操作。

这个地方的v27在后面会频繁用到,值为第9,10位变hex后的128位填充

这里是对xmmword_405018开始的96位的一个加密,可以看到前面405018~405048都是比较有规律的加密,其中xmmword_404340~404370是给出的常数,并且在后面的加密中不会改变。

要注意的是这里的add函数是分段加,即32位加一次,也就是把原先的128位整数分成4段依次做加法,每一段的溢出都直接舍弃。

这里是对原来数据加密之后的判断函数,显然我们要在404148处dump出来加密后的数据 

写脚本跑出来前面的10位密码(上面的4组位运算方程任意取两位即可,脚本中取得是第1,2个方程)

Table1=[0x83EC8B55,
0xEC81F0E4,
0x00000278,
0x405004A1]
Table=[0x7BB39408,
0xEA90BD98,
0xFE0F0B1D,
0x3E5F11D5]
cnst=[0,1,2,3]
cnst1=[4,4,4,4]
Table2=[0x85CAFC37,
0xFC3AF1B4,
0xEE160D39,
0x3E507535]
Table3=[0x89C43300,
0x02742484,
0x100F0000,
0x4041A805
]

for i in range(0x100):
    val=[0,0,0,0]
    for k in range(4):
        val[k]=(i<<24)|(i<<16)|(i<<8)|i
    temp1=[0,0,0,0]
    for k in range(4):
        temp1[k]=(Table[k]+val[k])&0xffffffff
    for k in range(4):
        temp1[k]^=Table1[k]
    for k in range(4):
        if temp1[k]<cnst[k]:
            temp1[k]|=0x100000000
        temp1[k]-=cnst[k]
    temp2=[0,0,0,0]
    temp3=[0,0,0,0]
    for k in range(4):
        temp2[k]=(cnst[k]+cnst1[k]+temp1[k])&0xffffffff
    for k in range(4):
        temp3[k]=(val[k]+Table2[k])&0xffffffff
    for k in range(4):
        temp2[k]^=temp3[k]
    if temp2==Table3:
        print (hex(i),hex(temp1[0]))

继续跟进,在这个函数快要结尾处可以看到往内存中的某一段写入了一些东西

并且写入的地方在本判断函数结束后要被调用,所以继续跟进,发现接下来的是对剩下的16位数字进行3DES加密处理。然后再将加密后的内容与后面的数据比较

其中Padding方式为PKCS7,在对3DES加密函数的动态调试中也可以发现密钥为AFSAFCEDYCXCXACNDFKDCQXC,

加密之后的HEX为507CA9E68709CEFA20D50DCF90BB976C9090F6B07BA6A4E8,网上找个轮子就能跑出来答案:0dcc509a6f75849b

然后和前面的10个密码组合一下即可

猜你喜欢

转载自blog.csdn.net/getsum/article/details/90580743
今日推荐