Angr - Examples

chevron-right从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)arrow-up-righthashtag
circle-info

如果程序使用scanf从stdin中一次获取多个值,则需要生成一个在**scanf**之后开始的状态。

代码取自https://github.com/jakespringer/angr_ctfarrow-up-right

输入以到达地址(指示地址)

import angr
import sys

def main(argv):
path_to_binary = argv[1]  # :string
project = angr.Project(path_to_binary)

# Start in main()
initial_state = project.factory.entry_state()
# Start simulation
simulation = project.factory.simgr(initial_state)

# Find the way yo reach the good address
good_address = 0x804867d

# Avoiding this address
avoid_address = 0x080485A8
simulation.explore(find=good_address, avoid=avoid_address)

# If found a way to reach the address
if simulation.found:
solution_state = simulation.found[0]

# Print the string that Angr wrote to stdin to follow solution_state
print(solution_state.posix.dumps(sys.stdin.fileno()))
else:
raise Exception('Could not find the solution')

if __name__ == '__main__':
main(sys.argv)

到达地址的输入(指示打印)

注册表数值

栈值

在这种情况下,输入是用 scanf("%u %u") 获取的,给定的值是 "1 1",所以栈中的值 0x00000001 来自用户输入。您可以看到这些值是如何从 $ebp - 8 开始的。因此,在代码中,我们已经$esp 减去了 8 字节(因为在那时刻 $ebp$esp 具有相同的值),然后我们推入了 BVS。

静态内存值(全局变量)

动态内存值(Malloc)

文件模拟

circle-info

请注意,符号文件还可能包含与符号数据合并的常量数据:

应用约束

circle-info

有时候像逐个字符比较长度为16的两个单词这样简单的人类操作(循环),对于angr来说会花费很多资源,因为它需要指数级地生成分支,因为它会根据if语句生成1个分支:2^16 因此,更容易要求angr回到先前的一个点(在那里真正困难的部分已经完成),然后手动设置这些约束

triangle-exclamation
circle-info

在这些情况下,您可以做的另一件事是hook the function giving angr something it can understand更容易。

模拟管理器

有些模拟管理器可能比其他的更有用。在前面的示例中,存在一个问题,因为创建了许多有用的分支。在这里,veritesting技术将合并这些分支并找到解决方案。 这个模拟管理器也可以通过以下方式激活:simulation = project.factory.simgr(initial_state, veritesting=True)

钩住/绕过对函数的一次调用

Hooking a function / Simprocedure

钩住一个函数 / Simprocedure

模拟带有多个参数的scanf

静态二进制文件

chevron-right从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)arrow-up-righthashtag

最后更新于