Angr AEG:堆溢出之Exploit自动天生 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

Angr AEG:堆溢出之Exploit自动天生

申博_安全预警 申博 281次浏览 已收录 0个评论

本文重点介绍了如何基于Angr进行漏洞利用,并对其进行自动利用。自动开发固有问题,又称自动开发生成,包括缺陷挖掘、碰撞分析、约束条件组织、约束求解、开发固有环节等。下面将通过工艺标记完成二进制顺序的自动开发和应用,并展示完整的AEG工艺。本文分析了2016年失眠症黑单的缺陷之一。下载站点包含源代码demo_bin。c、编译后的可执行文件demo_bin和Angr脚本solver.py。

0×00 破绽道理

1、源码剖析

起首检察源码 demo_bin.c,存在一处堆溢出破绽,症结点以下:

1) component_name[128]  大于 component->name[32];

2) initializa_component( char *cmp_naem) 函数中,在赋值时未搜检缓冲区巨细;

3) 挪用 do_something() 时,发生 Crash。

Angr AEG:堆溢出之Exploit自动天生

2、GDB 调试

剖析过顺序源码后,应用 GDB 动态调试 demo_bin,以触发 Crash。起首经由历程 r2 检察 initializa_component( char *cmp_naem) 所对应的汇编代码。

Angr AEG:堆溢出之Exploit自动天生

剖析后可知,构造体 component 巨细为 36 字节,个中 component->name[32] 占用 32 字节,随后 4 字节为函数指针,因而组织 PoC 为 “AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB”。

应用 GDB 加载 demo_bin 并输入 PoC,在 initializa_component( char *cmp_naem) 函数中,挪用 malloc()  以后设置断点。检察此时 malloc()  所分派的内存状况。

Angr AEG:堆溢出之Exploit自动天生

继承调试,单步至 initializa_component( char *cmp_naem) 函数返回,检察此时内存状况。可见 cmp 在堆上的地点为 “0x804b410”,而 cmp->do_something(1) 所对应的地点 “0x804b430” 现在已被 “\x42\x42\x42\x42” 所掩盖,以下图所示。

Angr AEG:堆溢出之Exploit自动天生

当顺序实行至 cmp->do_something(1) 时触发 Segmentation fault,此时 EIP 为 “\x42\x42\x42\x42”,注解顺序的掌握流已被挟制。

Angr AEG:堆溢出之Exploit自动天生

经由历程以上扼要剖析可知,demo_bin 中存在堆溢出破绽,可致使掌握流挟制。在此基础上,下文重要引见怎样经由历程 Angr 完成对该破绽的自动化发掘和应用。

0×01 Angr AEG  

完整的 AEG 历程,在逻辑上大抵可分为以下几个环节:

1) 破绽发掘,Angr 重要接纳带有前置束缚及途径挑选战略的标记实行;

2) 瓦解现场剖析:EIP 状况、内存结构;

3) 束缚条件组织;

4) 束缚求解,Exploit 天生;

1、破绽发掘  

在本例中,重如果针对掌握流挟制破绽的发掘。应用标记实行检测掌握流挟制,症结在于 EIP,若 EIP 完整被标记变量所掩盖,则代表着掌握流能够被挟制,此时 Angr 会抛出 unconstrained 状况。

solve.py 中 65 ~ 84 行,经由历程搜刮二进制顺序的状况空间以完成破绽发掘。因为 demo_bin.c 中的破绽逻辑较为简朴,因而在发掘历程当中并未到场庞杂的前置束缚以减缓途径爆炸,也未接纳分外的途径搜刮战略,仅运用 SimulationManager 的 step() 要领,轮回实行,直到涌现 unconstrained 状况。

注重,在设置 SimulationManager() 时,save_unconstrained 必需设置为 True。

Angr AEG:堆溢出之Exploit自动天生2、瓦解现场剖析

剧本运转不久后,便会触发 unconstrained 状况,此时须要对瓦解现场举行剖析,以剖断 unconstrained 状况的可应用性。

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

1) EIP 可控性剖析

solve.py 中运用 fully_symbolic() 要领搜检 EIP 中标记变量的数目。个中 state.arch.bits 代表体系字长(The number of bits in a word),state.solver.symbolic() 用以推断输入数据是不是为标记变量,该要领在 ./angr/state_plugins/solver.py 中完成:

Angr AEG:堆溢出之Exploit自动天生

当 EIP 完整被标记变量掩盖时,代表掌握流已被挟制,此时堆及 EIP 状况以下:  

Angr AEG:堆溢出之Exploit自动天生

在现实调试历程当中,会涌现屡次 unconstrained 状况,但前多少次标记变量均未能完整掩盖 EIP,因而并不能应用。终究 EIP 被标记变量完整掩盖时,其内容以下:

Angr AEG:堆溢出之Exploit自动天生

2)内存结构剖析

在触发掌握流挟制后,须要剖析以后状况下内存中标记变量的散布状况。solve.py 中的 find_symbolic_buffer() 完成相干功用,重要包孕查找标记输入、追踪标记变量两个局部。

Angr AEG:堆溢出之Exploit自动天生

(1) 查找标记输入

Angr 在处置惩罚 scanf 的输入数据时,接纳 streams 形式。默许状况下,stdin、stdout、stderr 均接纳该形式。state.posix.stdin 为输入顺序的悉数标记变量,调试效果以下:

Angr AEG:堆溢出之Exploit自动天生

(2) 追踪标记变量

经由历程 state.solver.get_variables() 追踪内存中的标记变量。该函数位于 ./angr/state_plugins/solver.py 中,返回效果以下:  

Angr AEG:堆溢出之Exploit自动天生

state.memory.addrs_for_name() 返回标记变量对应的地点,效果以下:  

Angr AEG:堆溢出之Exploit自动天生

至此,已完成破绽发掘与瓦解现场的剖析,后续须要连系 Exploit 的体式格局(ret2text、ret2syscall、ROP 等),组织完整的束缚条件,并求解。  

3、束缚条件组织

关于 Exploit 自动天生问题来讲,其症结是组织适宜的束缚条件,并应用 SMT(Satisfiability Modulo Theories) 束缚求解器求解,若束缚可解,则天生胜利,不然天生失利。个中包孕途径束缚、EIP 束缚、shellcode 束缚等。

本例中,Exploit 体式格局接纳 ret2text 且不斟酌平安机制,因而仅需找到一片足以安排 shellcode 的一连空间便可。搜检空间一连性的函数以下:

Angr AEG:堆溢出之Exploit自动天生

solve.py 中的 shellcode 巨细为 22 字节,终究组织束缚条件以下:   

Angr AEG:堆溢出之Exploit自动天生

4、束缚求解 

经由历程 ep.satisfiable() 对束缚条件 extra_constraints=(memory == sc_bvv,ep.regs.pc == buf_addr) 的可解性举行推断。终究剖断为束缚可解,并天生 Exploit:  

Angr AEG:堆溢出之Exploit自动天生

0×02 小结  

本文以简单的堆溢出为例,展示如何应用Angr自动利用。同时也展示了AEG的完整流程。本文不讨论在自动应用和标记实现中遇到的路径爆炸、路径选择、边界求解等问题。由于笔者对安格尔之战的时间不长,本文难免理解不当之处,看了一下《老大哥》的批评名单(Orz…)。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明Angr AEG:堆溢出之Exploit自动天生
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址