1625-5 王子昂 总结《2017年11月4日》 【连续第400天总结】
A. 上海邀请赛CTF(WP-Re)
B.
查壳发现有NsPack,百度下来脱壳机搞定
IDA反编译看到算法
将两个数组Dump下来写脚本即可:
d = [116, 104, 105, 115, 95, 105, 115, 95, 110, 111, 116, 95, 102, 108, 97, 103]
f = [18, 4, 8, 20, 36, 92, 74, 61, 86, 10, 16, 103, 0, 65, 0, 1, 70, 90, 68, 66, 110, 12, 68, 114, 12, 13, 64, 62, 75, 95, 2, 1, 76, 94, 91, 23, 110, 12, 22, 104, 91, 18]
for i in range(42):
print(chr(f[i]^d[i%16]), end='')
反编译不全,在OD中运行跟踪发现有大量花指令阻碍F5
不会脚本去花,于是一步一步跟
先打开”flag”文件,失败则报错,于是创建一个文件给他
接着在sub_401350函数中进行了大量运算,后来看结果发现是b64
再往下看,发现进行了四次b64+略微处理的操作
观察sub_401350的call可以发现四次调用b64的地址:
B64的调用向上翻一点就能找到,分别是+0x40、<<7和-0x9e
得到4个字符串以后在内存中可以看到:
然后将它们进行了逐个字符的拼接:
然后对它进行b64decode以后,通过sprintf(“%x”)以十六进制形式写入字符串,最后每个字符+0x10后输出
加密看起来很复杂,解密就很简单了,因为得到-0x10再b64encode以后的合成字符串只要提取其中一部分,组成之前4个字符串中的任意一个就可以解出明文了
于是写出逆变换脚本:
s = "FFIF@@IqqIH@sGBBsBHFAHH@FFIuB@tvrrHHrFuBD@qqqHH@GFtuB@EIqrHHCDuBsBqurHH@EuGuB@trqrHHCDuBsBruvHH@FFIF@@AHqrHHEEFBsBGtvHH@FBHuB@trqrHHADFBD@rquHH@FurF@@IqqrHHvGuBD@tCDHH@EuGuB@tvrrHHCDuBD@tCDHH@FuruB@tvrIH@@DBBsBGtvHH@GquuB@EIqrHHvGuBsBtGEHH@EuGuB@tvrIH@BDqBsBIFEHH@GFtF@@IqqrHHEEFBD@srBHH@GBsuB@trqrHHIFFBD@rquHH@FFIuB@tvrrHHtCDB@@"
s1=""
for i in s:
s1 += (chr(ord(i)-0x10))
s2 = bytes.fromhex(s1)
s3 = base64.b64encode(s2)
s4 = ''
for i in range(len(s3)//4):
s4 += hex(s3[i*4])[2:]
s4 = bytes.fromhex(s4)
for i in range(4-(len(s4)%4)):
s4 += b'='
s5 = base64.b64decode(s4)
print(s5)
C. 明日计划
Misc-clemency的WP