【PWN】关于鸽了这么多天我都在干什么

admin 2023年12月12日03:09:13评论25 views字数 2468阅读8分13秒阅读模式

写在开头

【PWN】关于鸽了这么多天我都在干什么鑫总提了一辆奥迪,不知道是不是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)): 使用angrhook_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的原因是限制例如readrecv等函数的输入和输出的最大字符。

simgr = p.factory.simgr(state, save_unconstrained=True): 创建 SimulationManager 对象 simgr,设置保存无约束状态的选项。

通过以下代码:

while simgr.active:
    simgr.step()

可以模拟程序的每一步的执行,并对程序状态的全局参数做修改或查看。

【PWN】关于鸽了这么多天我都在干什么

也可以直接输入:

simgr.explore(find=lambda s: xxxxxx)

可以自动化的对二进制程序进行模拟执行,find参数表示停止的条件,类型是函数,可以传入一个匿名函数,参数s为一个state对象。

zeratool就是依靠上述方式来对漏洞进行自动化查找,我在读它源码的时候学到了许多。

二、buuoj

每天回宿舍开电脑会打开刷上几题,巩固基础的同时也在查缺补漏。讲真的,buuoj是一个非常好的刷题网站,大家快去刷题(

战果:

【PWN】关于鸽了这么多天我都在干什么

做题时间集中在凌晨捏:

【PWN】关于鸽了这么多天我都在干什么

虽然还在第一页,但是好在已经快刷完了(都是以前太懒了,对不起以后我一定改),空的一般都是ret2libc的题目,做的时候发现以前的ctf真的很喜欢出这种题,我要么在本地getshell,要么懒得做了。

虽然但是,比赛的时候可不可以出一题,让我混混分(?

三、学会了公众号排版和美观

至少这一次的公众号相对于前面那些,有一点审美上的提升,嗯...

写在最后

最近临近期末考试,也无心去学习堆部分的内容,计划可能会出栈部分的知识讲解。


原文始发于微信公众号(Stack0verf1ow):【PWN】关于鸽了这么多天我都在干什么

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月12日03:09:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【PWN】关于鸽了这么多天我都在干什么http://cn-sec.com/archives/2255309.html

发表评论

匿名网友 填写信息