写在开头
鑫总提了一辆奥迪,不知道是不是A8,这边就莫名其妙的把他的车牌号加在文章的开头吧~恭喜鑫总喜提新车~~~
正文
自从上次更新完最后一篇文章之后,不知不觉已经过去了十几天。本来想在那之后开启对堆部分的学习,想想没有巩固就开启新的篇章似乎不太好,毕竟后边还要学习的东西不仅仅有堆溢出,还有内核溢出,以及还要去分析其他语言例如ruby写的二进制程序等等...
但是,这十几天也不是什么都没干在偷懒,主要做了以下工作:
一、课题
有意思的是,刚好有个老师的项目是关于格式化字符串漏洞的全自动利用,他的目的是对zeratool
这款开源工具进行二开。本来是交给实验室另外一个师兄做的,但是他似乎遇到了一点毕业论文方面的问题,没空管,所以就丢给了我。
对zeratool
这个工具进行源码分析。其主要是使用angr
库对二进制文件进行动态调试分析,对格式化字符串漏洞、栈溢出漏洞等几种漏洞都能进行利用。angr
库的使用我想在这边做一下简要的说明,让大家伙见识一下它的强大。
binary_name = "./backdoor"
extras = {so.REVERSE_MEMORY_NAME_MAP, so.TRACK_ACTION_HISTORY, so.TRACK_CONSTRAINTS}
argv = [binary_name]
input_arg = claripy.BVS("input", 300 * 8)
p = angr.Project(binary_name, load_options={"auto_load_libs": False}, main_opts={'base_addr': 0x400000})
p.hook_symbol("printf", printf_model.printFormat(0))
state = p.factory.full_init_state(
args=argv,
stdin=input_arg,
add_options=extras,
)
state.globals["user_input"] = input_arg
state.libc.buf_symbolic_bytes = 0x100
state.globals["inputType"] = "STDIN"
simgr = p.factory.simgr(state, save_unconstrained=True)
上述代码主要是用 angr
库来设置一个二进制文件(backdoor
)的符号执行环境。
extras = {so.REVERSE_MEMORY_NAME_MAP, so.TRACK_ACTION_HISTORY, so.TRACK_CONSTRAINTS}
: 反向内存名映射、跟踪操作历史和跟踪约束
argv = [binary_name]
: 创建程序的命令行参数。
input_arg = claripy.BVS("input", 300 * 8)
: 创建了一个300字符的符号变量 input_arg
,作为程序的标准输入。
p = angr.Project(binary_name, load_options={"auto_load_libs": False}, main_opts={'base_addr': 0x400000})
: 创建一个 angr
项目 p
,禁用自动加载库的选项,设置主程序的基地址为 0x400000
。这主要是为了在idapro也能看到同样的地址,方便调试。
p.hook_symbol("printf", printf_model.printFormat(0))
: 使用angr
的 hook_symbol
方法将 printf
函数替换为一个模型函数 printf_model.printFormat(0)
。在程序执行过程中,遇到 printf
函数,angr
将会调用这个模型函数而不是实际的 printf
函数。
state = p.factory.full_init_state(args=argv, stdin=input_arg, add_options=extras,)
: 使用full_init_state
创建一个完全初始化的状态 state
,设置程序的命令行参数、标准输入和额外的选项。
state.libc.buf_symbolic_bytes = 0x100
: 设置 libc.buf_symbolic_bytes
的值为 0x100
的原因是限制例如read
和recv
等函数的输入和输出的最大字符。
simgr = p.factory.simgr(state, save_unconstrained=True)
: 创建 SimulationManager
对象 simgr
,设置保存无约束状态的选项。
通过以下代码:
while simgr.active:
simgr.step()
可以模拟程序的每一步的执行,并对程序状态的全局参数做修改或查看。
也可以直接输入:
simgr.explore(find=lambda s: xxxxxx)
可以自动化的对二进制程序进行模拟执行,find参数表示停止的条件,类型是函数,可以传入一个匿名函数,参数s为一个state对象。
zeratool就是依靠上述方式来对漏洞进行自动化查找,我在读它源码的时候学到了许多。
二、buuoj
每天回宿舍开电脑会打开刷上几题,巩固基础的同时也在查缺补漏。讲真的,buuoj是一个非常好的刷题网站,大家快去刷题(
战果:
做题时间集中在凌晨捏:
虽然还在第一页,但是好在已经快刷完了(都是以前太懒了,对不起以后我一定改),空的一般都是ret2libc
的题目,做的时候发现以前的ctf真的很喜欢出这种题,我要么在本地getshell,要么懒得做了。
虽然但是,比赛的时候可不可以出一题,让我混混分(?
三、学会了公众号排版和美观
至少这一次的公众号相对于前面那些,有一点审美上的提升,嗯...
写在最后
最近临近期末考试,也无心去学习堆部分的内容,计划可能会出栈部分的知识讲解。
原文始发于微信公众号(Stack0verf1ow):【PWN】关于鸽了这么多天我都在干什么
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论