首先我是直接在kali中安装的,也是边练边学的。
嗯,要在纯净python环境,所以是在 virtualenv 虚拟环境里,也不是特别会用这个,按照教程一步步做的
source venv/bin/activate
进入了对应环境
退出是
deactivate
en,ipython交互性确实好一些
00_angr
import angr
p=angr.Project('./dist/00_angr_find')
init_state=p.factory.entry_state()
sm=p.factory.simulation_manager(init_state)
sm.explore(find=0x8048678)
# sm.found[0]
found_state=sm.found[0]
found_state.posix.dumps(0)
得到正确字符串
01_angr
嗯,最好都加一个 avoid= ,也可以加快模拟
02_angr
sm.explore( )参数也可以是字符串。
不知道为什么写地址跑不出来。
import angr
p=angr.Project('./dist/02_angr_find_condition')
init_state=p.factory.entry_state()
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]
print(found_state.posix.dumps(0))
使用指定地址作为目标(find=address
)没有预期的效果,但使用字符串匹配时却可以正常工作。这可能是由于以下几种原因:
-
路径爆炸:
angr
在分析复杂的二进制程序时可能会遇到路径爆炸问题,即存在大量的执行路径。设置特定地址作为目标可能无法让angr
找到正确的路径,因为它可能在其他路径上花费太多时间或资源。 -
目标地址不可达:目标地址可能并不是代码执行的直接目标。例如,如果目标地址在特定条件下才能被执行,而条件不满足,
angr
就无法到达该地址。 -
代码优化或跳转:编译器的优化可能导致目标地址的直接访问变得复杂,例如内联函数或跳转指令。字符串匹配可能会更直接地找到这些代码片段。
-
符号执行约束:
angr
依赖于符号执行来探索程序的执行路径。如果约束条件太复杂或过于松散,可能无法正确解析所有可能的执行路径。