BUUCTF [RoarCTF2019]polyre

第一次遇到反控制流平坦化的题目,记录一下。
扔进ida,发现main函数中全是while循环,后来上网查阅才发现是控制流平坦化。
反控制流平坦化的教程可以参考这个blog:
https://www.cnblogs.com/kelec0ka/p/17909008.html
使用deflat生成recovered文件:

python deflat.py -f test --addr 0x400620


用ida打开得到反混淆后的伪代码:

可以看到其中有很多没有意义的判断,推测应该为无用代码,用来进行混淆的。

这一块为关键代码,推测为将flag每8个一组,每组取出乘以二,或者异或,最后和s1比较。
后来知道这是CRC加密算法,写出解密脚本:

secret = [0xBC8FF26D43536296, 0x520100780530EE16, 0x4DC0B5EA935F08EC,
        0x342B90AFD853F450, 0x8B250EBCAA2C3681, 0x55759F81A2C68AE4,
        0xB0004B7679FA26B3]
key = 0xB0004B7679FA26B3
flag = ''
for s in secret:
    for i in range(64):
        sign = s & 1
        # 判断是否为负
        if sign == 1:
            s ^= key
        s //= 2
        # 防止负值除2,溢出为正值
        if sign == 1:
            s |= 0x8000000000000000
    # 输出表
    print(hex(s))
    # 计算CRC64
    j = 0
    while j < 8:
        flag += chr(s&0xFF)
        s >>= 8
        j += 1
print(flag)
#flag{6ff29390-6c20-4c56-ba70-a95758e3d1f8}
posted @ 2024-08-01 20:10  Ve2n0uth  阅读(20)  评论(0编辑  收藏  举报