1.00_angr_find
程序本身非常简单,可以采用常规的逆向手段进行解密
import sys
def main(argv):
p=angr.Project('./00_angr_find')#加载00_angr_find这个程序
init_state=p.factory.entry_state()#给定一个初始化的状态
sm=p.factory.simulation_manager(init_state)#使用simgr进行执行
good_addr=0x08048678#该地址是输出good job的地址
sm.explore(find=good_addr)#“探索”该地址
if sm.found:
solution_state=sm.found[0]
print(solution_state.posix.dumps(0))
if __name__=='__main__':
main(sys.argv)
~
得到第一题的flag为: JXWVXRKX
2.01_angr_avoid
第二题和第一题差不多,在第二题中,我们不只是”find“,还有”avoid“
主要是由于二进制非常大,我们需要设置一些angr避免执行的地址,加快符号执行的速度。
import sys
def main(argv):
p=angr.Project('./01_angr_avoid')
init_state=p.factory.entry_state()
sm=p.factory.simulation_manager(init_state)
good_addr=0x080485E0
bad_addr=0x080485F2
sm.explore(find=good_addr,avoid=bad_addr)
if sm.found:
solution_state=sm.found[0]
print(solution_state.posix.dumps(0))
else:
raise Exception('Could not find the solution')
if __name__=='__main__':
main(sys.argv)
得到flag为: HUJOZMYS
3.02_find_condition
使用IDA进行分析可以看到有非常多的输出Good Job的地址
所以我们就定义输出Good Job的函数,使用angr寻找函数
import angr
import sys
def main(argv):
p=angr.Project('./02_angr_find_condition')
init_state=p.factory.entry_state()
sm=p.factory.simulation_manager(init_state)
def good(state):
return b'Good Job.'in state.posix.dumps(1)
def bad(state):
return b'Try again.'in state.posix.dumps(1)
sm.explore(find=good,avoid=bad)
if sm.found:
solution_state=sm.found[0]
print(solution_state.posix.dumps(0))
if __name__=='__main__':
main(sys.argv)
得到flag为: HETOBRCU