利用angr的SIM_PROCEDURES模块来进行软件漏洞挖掘
利用angr的SIM_PROCEDURES模块进行软件漏洞挖掘可以帮助发现程序中存在的安全弱点。SIM_PROCEDURES是angr中的一个模块,可以用于模拟程序的内存和寄存器操作。下面是一些使用angr的SIM_PROCEDURES模块的例子。
1. 漏洞挖掘:栈溢出
漏洞描述:程序中存在一个栈溢出漏洞,当用户输入超过栈上分配的缓冲区大小时,会覆盖到返回地址。
使用angr的SIM_PROCEDURES模块可以模拟栈的操作,找到覆盖返回地址的输入数据。首先,我们需要定义一个模拟栈的插件Stack模块:
import angr
import simuvex
class MyStack(simuvex.SimProcedure):
def run(self, ret_addr, buf_addr, buf_size):
# 将数据写入模拟栈
self.state.memory.store(ret_addr, self.state.se.BVV('A'*4, 32))
self.state.memory.store(buf_addr, self.state.se.BVV('B'*buf_size, 8*buf_size))
然后,我们可以用angr的load_binary函数加载一个二进制文件,并将我们定义的模拟栈Stack模块注册到SIM_PROCEDURES中。接下来,我们可以使用angr的路径获取和执行器来寻找和执行漏洞路径:
import angr
# 加载二进制文件
p = angr.Project('./vulnerable_program')
# 注册我们的模拟栈
p.hook_symbol('stack', MyStack())
# 获取和执行器
state = p.factory.entry_state()
path = p.factory.path(state)
ex = p.surveyors.Explorer(start=path, find=(0xDEADBEEF,))
ex.run()
# 寻找到了漏洞路径
if ex.found:
found = ex.found[0].state
ret_addr = found.solver.eval(found.regs.ip)
buf_addr = found.solver.eval(found.regs.sp) - buf_size
buf_data = found.memory.load(buf_addr, buf_size).concat
print("栈溢出漏洞检测到:返回地址 0x%x,缓冲区数据 %s" % (ret_addr, buf_data))
上面的代码中,我们用angr的Surveyors插件创建了一个路径执行器ex,并使用run()方法来执行excute,如果找到了目标地址0xDEADBEEF,就会触发found事件,我们可以从found事件中获取到漏洞处的状态和内存数据。
2. 漏洞挖掘:格式化字符串漏洞
漏洞描述:程序中存在一个格式化字符串漏洞,用户可以控制格式化字符串函数的参数,从而覆盖内存地址。
使用angr的SIM_PROCEDURES模块可以模拟格式化字符串函数的操作,从而找到格式化字符串漏洞。首先,我们需要定义一个模拟格式化字符串函数printf模块:
import angr
import simuvex
class MyPrintf(simuvex.SimProcedure):
def run(self, fmt, args):
# 读取格式化字符串
fmt_str = self.state.memory.load(fmt, 100)
# 打印格式化字符串
print(fmt_str)
# 执行默认printf函数
return self.state.se.BVV(0, self.state.arch.bits)
然后,我们可以用angr的load_binary函数加载一个二进制文件,并将我们定义的模拟格式化字符串函数MyPrintf模块注册到SIM_PROCEDURES中。接下来,我们可以使用angr的路径获取和执行器来寻找和执行漏洞路径:
import angr
# 加载二进制文件
p = angr.Project('./vulnerable_program')
# 注册我们的模拟格式化字符串函数
p.hook_symbol('printf', MyPrintf())
# 获取和执行器
state = p.factory.entry_state()
path = p.factory.path(state)
ex = p.surveyors.Explorer(start=path, find=(0xDEADBEEF,))
ex.run()
# 寻找到了漏洞路径
if ex.found:
found = ex.found[0].state
fmt_addr = found.solver.eval(found.regs.esp)
fmt_str = found.memory.load(fmt_addr, 100).string
print("格式化字符串漏洞检测到:%s" % fmt_str)
上面的代码中,我们用angr的Surveyors插件创建了一个路径执行器ex,并使用run()方法来执行excute,如果找到了目标地址0xDEADBEEF,就会触发found事件,我们可以从found事件中获取到漏洞处的状态和格式化字符串。
通过上述代码示例,我们可以利用angr的SIM_PROCEDURES模块进行软件漏洞挖掘。SIM_PROCEDURES模块可以灵活模拟程序中的各种函数操作,帮助我们找到程序中的安全弱点。
