太美丽了
家里github又直连不了了,唉
git clone https://github.com/cq674350529/deflat.git
python deflat.py -f ./attachment --addr 0x400620
addr是main的地址
说是要先安angr才能用,之前安过,应该直接用就行了。
等待ing
successful
围观
太丑陋了
main函数只剩143行了,很顶
while语句没用,有脚本可以删,脚本暂时不熟,扒别的大佬的
st = 0x0000000000400620 #main开始
end = 0x0000000000402144 #main结束
def patch_nop(start,end):
for i in range(start,end):
ida_bytes.patch_byte(i, 0x90) #修改指定地址处的指令 0x90是最简单的1字节nop
def next_instr(addr):
return addr+idc.get_item_size(addr) #获取指令或数据长度,这个函数的作用就是去往下一条指令
addr = st
while(addr<end):
next = next_instr(addr)
if "ds:dword_603054" in GetDisasm(addr): #GetDisasm(addr)得到addr的反汇编语句
while(True):
addr = next
next = next_instr(addr)
if "jnz" in GetDisasm(addr):
dest = idc.get_operand_value(addr, 0) #得到操作数,就是指令后的数
ida_bytes.patch_byte(addr, 0xe9) #0xe9 jmp后面的四个字节是偏移
ida_bytes.patch_byte(addr+5, 0x90) #nop第五个字节
offset = dest - (addr + 5) #调整为正确的偏移地址 也就是相对偏移地址 - 当前指令后的地址
ida_bytes.patch_dword(addr + 1, offset) #把地址赋值给jmp后
print("patch bcf: 0x%x"%addr)
addr = next
break
else:
addr = next
很神奇。
然后摆了,决定不做了。
更新:删while须谨慎,搞不好删多了。