第一次遇到反控制流平坦化的题目,记录一下。
扔进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}
标签:BUUCTF,polyre,sign,flag,0xB0004B7679FA26B3,反控制,RoarCTF2019
From: https://www.cnblogs.com/reverse-chen/p/18337407