angr系列
00_angr_find
01_angr_avoid
02_angr_find_condition
03_angr_symbolic_registers
04_angr_symbolic_stack
05_angr_symbolic_memory
06_angr_symbolic_dynamic_memory
07_angr_symbolic_file
08_angr_constraints
09_angr_hooks
10_angr_simprocedures
13_angr_static_binary
文章目录
伪代码分析

这个是直接把参数放在栈中处理,所以我们需要利用代码在函数执行起始处构造栈空间(栈符号化)
符号化栈需要观察栈帧:

构建出start_address处的栈后,再来进行下一步的操作:
padding_size=8
init_state.stack_push(init_state.regs.ebp)
init_state.regs.ebp=init_state.regs.esp
init_state.regs.esp-=padding_size
pass1=init_state.solver.BVS("pass1",32)
pass2=init_state.solver.BVS("pass2",32)
init_state.stack_push(pass1)
init_state.stack_push(pass2)
这里符号化栈可以对照这符号化内存地址单元和寄存器来进行观察
疑问点
这里为什么是8?

看了一下esp栈帧,除去填入的ebp,感觉padding_size应该是0x18呀,这样的话,才符合呀
动调后:

看了一下此时eax的值和ebp的值,直接发现
ebp+var_10就等于ebp-10(我一直以为是+10.误认为是上一个函数的内存单元格。)
其实这里也写了:

那对于-8就没有任何问题了。解释一下为什么是-8.
这里的输入参数是ebp-0x10和ebp-0x0C,ebp是高地址(栈都是由高地址向低地址拓展)

因为参数1占四个字节,所以0xC~0x8就是这个参数所占内存,因此此时所需填充的就是8个字节(即抬高栈顶8个字节)
最后进行求解:
password1=found_state.solver.eval(pass1)
password2=found_state.solver.eval(pass2)
脚本:
import angr
import sys
def main(argv):
bin_path=argv[1]
p=angr.Project(bin_path)
start_addr=0x08048697
init_state=p.factory.blank_state(addr=start_addr)
padding_size=8
init_state.stack_push(init_state.regs.ebp)
init_state.regs.ebp=init_state.regs.esp
init_state.regs.esp-=padding_size
pass1=init_state.solver.BVS("pass1",32)
pass2=init_state.solver.BVS("pass2",32)
init_state.stack_push(pass1)
init_state.stack_push(pass2)
sm=p.factory.simgr(init_state)
def is_good(state):
return b'Good Job.' in state.posix.dumps(1)
def is_bad(state):
return b'Try again.' in state.posix.dumps(1)
sm.explore(find=is_good,avoid=is_bad)
if sm.found:
found_state=sm.found[0]
password1=found_state.solver.eval(pass1)
password2=found_state.solver.eval(pass2)
print("Solution:{} {}".format(password1,password2))
else:
raise Exception("Solution not found")
if __name__=='__main__':
main(sys.argv)

Solution:1704280884 2382341151
验证

本文详细介绍了使用angr工具进行栈符号化的步骤及原理,重点解析了如何构造初始状态、设置栈帧以及参数传递的过程。通过实例演示了如何找到正确参数并解决实际问题。
1770

被折叠的 条评论
为什么被折叠?



