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
文章目录
伪代码分析


起始地址我们需要在初始化文件之前(因为这里并没有符号化文件名),输入password之后,

这里选在ignore_me之后,把栈变量清理之后地址处。即0x080488D6
在这里我们需要符号化文本的内容(我个人感觉并非整个文本文件),如下,文本文件名是OJKSQYDP.txt,文件大小是file_size=0x40,紧接着进行文件文本符号化,和之前的符号化有些不一样:password=init_state.solver.BVS("password",file_size*8),sim_file=angr.storage.SimFile(filename,content=password,size=file_size)
filename='OJKSQYDP.txt'
file_size=0x40
password=init_state.solver.BVS("password",file_size*8)
sim_file=angr.storage.SimFile(filename,content=password,size=file_size)
然后进行相应的 插入操作:
init_state.fs.insert(filename,sim_file)
最后进行文本内容的求解:
password_bytes=found_state.solver.eval(password,cast_to=bytes)
脚本
import sys
import angr
def main(argv):
bin_path=argv[1]
p=angr.Project(bin_path)
start_addr=0x080488D6
init_state=p.factory.blank_state(addr=start_addr)
filename='OJKSQYDP.txt'
file_size=0x40
password=init_state.solver.BVS("password",file_size*8)
sim_file=angr.storage.SimFile(filename,content=password,size=file_size)
init_state.fs.insert(filename,sim_file)
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)
dd sm.explore(find=is_good,avoid=is_bad)
if sm.found:
found_state=sm.found[0]
password_bytes=found_state.solver.eval(password,cast_to=bytes)
print("Solution:{}".format(password_bytes.decode('utf-8')))
else:
raise Exception("Solution not found")
if __name__=='__main__':
main(sys.argv)

AZOMMMZM
验证:

博客围绕angr系列展开,包含00_angr_find到13_angr_static_binary等内容。还进行了伪代码分析,确定起始地址,对文本内容进行符号化及插入操作,最后求解文本内容,此外还有相关脚本及验证部分。
1768

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



