Angr学习 04_angr_symbolic_stack
1. IDA
- 本题与第三题的区别在于这个题的参数不是寄存器,而是直接使用了栈
- 这个本质上是与32位程序的参数调用顺序有关
- 上一道题我们直接跳过了输入函数,因此eax,ebx,edx依次压入栈,所以我们直接修改寄存器的值就行
- 本题我们需要手动布置栈
2.栈布局
- 查看一下动态汇编代码
- 这个偏移也比较好算
- esp只需要抬高0x8即可
- 然后push我们预先设置好的符号向量
3.栈空间
- 大致我们的栈就布置成这样
- 然后我们就可以顺利执行exp了
4. exp
import angr
import claripy
filename = "04_angr_symbolic_stack"
p = angr.Project(filename)
startAddr = 0x08048697
init_state = p.factory.blank_state(addr=startAddr)
init_state.stack_push(init_state.regs.ebp)
init_state.regs.ebp = init_state.regs.esp
init_state.regs.esp -= 8
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.simulation_manager(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]
passwodr1 = found_state.solver.eval(pass1)
passwodr2 = found_state.solver.eval(pass2)
print("Solution:",int(passwodr1), int(passwodr2))
else:
raise Exception("No solution found!")
5. 执行结果