最近遇到一个程序采用了控制流平坦化的技术,如下图所示
在网上搜索后,找到https://security.tencent.com/index.php/blog/msg/112
(腾讯安全应急响应中心 Tencent Security Response Center) 博客 利用符号执行去除控制流平坦化
利用给出的工具deflat.py可以去除控制流平坦化。
但由于angr、barf版本原因,原来的程序运行有问题。下载SnowGirls给出的版本https://github.com/SnowGirls/deflat
执行仍然出现问题,分别在112、32、138、145行出现问题。
google后找到了解决方案,现将详细解决过程过程列出方便广大网友。
修改记录:
1. 在109行出现错误,错误信息如下
File "deflat.py", line 109, in
if ins.mnemonic.startswith('cmov'):
AttributeError:'DualInstruction' object has no attribute 'mnemonic'
修改前:
ifins.mnemonic.startswith('cmov'):
修改为:
if ins.asm_instr.mnemonic.startswith('cmov'):
2. 在112行出现错误
File"deflat.py", line 112, in
elif ins.mnemonic.startswith('call'):
AttributeError:'DualInstruction' object has no attribute 'mnemonic'
修改前:
elifins.mnemonic.startswith('call'):
修改为:
elif ins.asm_instr.mnemonic.startswith('call'):
3. 在32行出现错误
File"deflat.py", line 32, in statement_inspect
if len(expressions) != 0 andisinstance(expressions[0], pyvex.expr.ITE):
TypeError: object of type'generator' has no len()
修改前:
if len(expressions) != 0 andisinstance(expressions[0], pyvex.expr.ITE):
修改为:
if len(list(expressions)) != 0 and isinstance(expressions[0],pyvex.expr.ITE):
4. 在32行出现错误
File"deflat.py", line 32, in statement_inspect
if len(list(expressions)) != 0 andisinstance(expressions[0], pyvex.expr.ITE):
TypeError: 'generator'object has no attribute '__getitem__'
修改前:
if len(list(expressions)) != 0 and isinstance(expressions[0],pyvex.expr.ITE):
修改为:
if len(list(expressions)) != 0 andisinstance(expressions,pyvex.expr.ITE):
5. 在138行出现错误
File "deflat.py", line 138, in
fill_nop(origin_data, file_offset,file_offset + last_instr.size - 1)
AttributeError:'DualInstruction' object has no attribute 'size'
修改前:
fill_nop(origin_data,file_offset, file_offset + last_instr.size - 1)
修改为:
fill_nop(origin_data, file_offset, file_offset + last_instr.asm_instr.size - 1)
6. 在145行出现错误
File"deflat.py", line 145, in
origin_data[file_offset + 1] =opcode[instr.mnemonic[4:]]
AttributeError:'DualInstruction' object has no attribute 'mnemonic'
修改前:
origin_data[file_offset+ 1] = opcode[instr.mnemonic[4:]]
修改为:
origin_data[file_offset + 1] = opcode[instr.asm_instr.mnemonic[4:]]