【学习笔记】CTF PWN选手的养成(四)其他漏洞 && 从CTF到实战

本文详细介绍了CTF PWN比赛中的五种常见漏洞:格式化字符串、竞争条件、代码逻辑漏洞、类型混淆和缓冲区未初始化。通过具体的例子和比赛题目,阐述了每种漏洞的原理、利用方式以及实战中的应用。此外,还讨论了从CTF到实战的挑战,包括漏洞挖掘对象的变化和不同系统的目标文件利用技巧,并提供了实际案例和入手点建议。

0X01 格式化字符串

1、格式化串介绍:https://en.wikipedia.org/wiki/Printf_format_string

2、格式化串相关函数:printf、fprintf、sprintf等

3、格式化漏洞:

  • 触发形如printf(fmtstr)的调用,fmtstr="%$22p"时可以打印栈指针之后第22个DWORD,fmtstr="%1000c%22n"时可以将栈指针之后第22个DWORD作为地址写入1000
  • https://www.exploit-db.com/docs/28476.pdf

4、例题

  • MMACTF 2016 greeting
  • HCTF 2016 fheap(利用格式化串漏洞leak栈中的数据)
  • RuCTF 2016 weather
  • 作业:完成MMACTF 2016 greeting

0X02 竞争条件漏洞

1、竞争条件:竞争条件指多个线程或者进程在读写一个共享数据。竞争条件发送时程序最终的结果依赖于多个进程的指令执行顺序。

2、通过竞争条件,我们可以让程序执行超出预期的行为,如:

  • Thread1:free(p1),p1=0;
  • Thread2:p2=malloc(),read(p2),p1->callfunc()

3、如果Thread1执行完第一条语句,Thread2开始执行并执行至最后一条语句,则会产生Use After Free进而控制流劫持。

4、关键:如何控制线程执行的顺序。大名鼎鼎的脏牛就是这类漏洞。

5、例题:

  • 安恒杯 武汉大学邀请赛 fackfuzz(多线程竞争条件造成UAF)
  • Stupid shell(多进程竞争条件造成越权读文件)

0X03 代码逻辑漏洞

1、代码逻辑漏洞的表现方式多种多样,没有定式,难以自动化检测

2、例题:UCTF 2016 note 代码逻辑漏洞导致的控制流劫持

3、未来漏洞的走向,缓冲区溢出比较容易检测。

0X04 类型混淆漏洞

1、将类型A的对象当作类型B的对象进行引用与操作

  • 显示类型转换导致的类型混淆:static_cast 子类转父类:static_cast在编译时C++编译器会检查转换前的类型和转换后的类型是否兼容,编译器只允许derived class转换为base class或base class转换为derived class,前者称为upcast,后者称为downcast。由于derived class的内存布局通常包含base class,所以upcast通常会存在安全问题,但是downcast却可能存在类型混淆的问题。如说在base class的对象中使个只有derived class存在的成员就会产生内存越界访问。
  • 代码中的逻辑错误或漏洞导致的类型混淆:破坏了类/结构题中的表示类型数据(广义):如修改vatable也算一种类型混淆。

2、例题:无。建议看看类型混淆的CVE,如CVE-2015-3077,目前在CTF中没有看到相关题目。

0X05 缓冲区未初始化

1、栈未初始化时,栈中数据为上次函数调用留下的栈帧

2、堆未初始化时,堆中数据为上次使用该堆块所留下的数据

3、利用举例:

  • 若data在栈上且未初始化,代码read(data);puts(data);可能会造成栈中数据被打印出来
  • 若ptr在栈上且未初始化,代码read(ptr);可能会导致任意写;
  • 若ptr在堆上且未初始化,if(ptr->data!=null) read(ptr->data)可能导致任意写

4、例题:

  • UCTF 2016 note(可以用栈未初始化漏洞做)
  • 华山杯 2016 决赛 SU_PWN(栈未初始化漏洞泄露栈地址)
  • 33C3 CTF PWN

 

从CTF到实战

1、从CTF与实战的挑战

漏洞挖掘对象的放大:

  • CTF:规模较小的binary程序
  • 实战:最大至一个多层的子系统
  • 分析对象规模的差距直接导致了漏洞挖掘的方法完全不同,在CTF中,由于binary程序较小,所以逆向整个binary是可能的。但是在实战中,由于分析规模较大,通常要通过攻击面分析、数据流分析、fuzz等手段进行漏洞分析。

案例:挖掘分析安卓二进制漏洞

  • 攻击面分析,寻找潜在的可能被攻击的地方,通常是攻击者可以注入数据的地方,如USB模块(电脑要通过USB与系统交互)等
  • 选择攻击面进行进一步数据流、控制流分析。分析输入数据在程序中是如何传递的,在传递过程中寻找是否可能存在漏洞。或者根据对攻击面的了解编写fuzzer进行fuzz。

存在漏洞的目标和系统种类繁多:

  • CTF:较为单一的ELF文件,Linux系统
  • 实战:各种各样的目标文件、各种各样的系统。
  • 不同系统不同目标文件的利用套路可能完全不同,如之前讲的ptmalloc的利用姿势在jemalloc中大多数都无法使用,不同目标文件的调试方法和EXP编写方法也有所不同。

案例:利用Adobe Flash AVM中的二进制漏洞

  • 将Adobe flash AVM的目标文件flash .ocx IDA 中,结合前些年泄露的AVM plus源代码,定位漏洞触发的位置以及注意观察点。以及定位script层漏洞触发关键代码与native层代码的关系。
  • 在script层编写Action script触发漏洞,编写中可能需要用到actionscript专有的堆喷、堆风水等技术,在native层在关键触发位置中和观察点下断点,观察内存和变量
  • 需要频繁的在script层和Native层进行切换,需要了解script层的代码与native层代码的对应关系。

2、CTFer在实战中的入手点

推荐入手点1:智能设备如智能路由器、智能摄像头。如CVE-2015-3036 NetUSB内核栈溢出漏洞。智能设备和CTF差别不大。

推荐入手点2:Windows下Office系列漏洞。如CVE-2015-1641类型混淆漏洞。

推荐入手点3:阅读各种漏洞分析报告:cve-2016-4117、cve-2015-1641等

推荐一本书:《漏洞战争》

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值