浅谈CTF PWN——学习CTF第一天

文章目录

  • PWN简介
      • 对象
      • 目标
      • 技术
      • 软件
      • 前置技能
  • 注意事项
      • 学习套路
  • 漏洞的一般形式——溢出(程序设计者设计时的不足所带来的错误)
      • 缓冲区溢出(Buffer Overflow)
      • 整数溢出(Integer Overflow)
      • 格式化字符串(Format String)
      • 释放后使用(Use-After-Free)
      • 逻辑漏洞
  • 漏洞挖掘中的逆向技巧
      • 关键把握数据结构分析
      • 控制流分析
      • 数据流分析
  • CTF中漏洞挖掘中的分析策略
      • 目标文件较小时
      • 目标文件较大时
      • _注意事项_
      • 控制流分析——理清程序逻辑
      • 数据流分析

PWN简介

对象

  • 代码(源码,字节码,汇编等)

目标

  • 发掘漏洞
  • 利用漏洞
  • 修补漏洞

技术

  • 逆向工程(RE)
  • 漏洞挖掘与利用
  • 漏洞防御技术

软件

  • 静态分析:IDA Pro
  • 动态调试:gdb(with peda插件 or gef插件),windbg(window环境下),ollydbg
  • Exploit(漏洞利用):pwntools,zio(Python库文件)

前置技能

  • 汇编语言:程序执行,函数栈帧,函数调用等
  • 编译、链接、装载、执行
  • ELF文件结构
  • Linux系统相关:文件描述符,系统调用,socket编程,shell命令等

注意事项

学习套路

  • 套路是有限的,一定要学习完所有的招式
  • 针对每种套路都要练习1~2道习题
  • 学习阶段:总结套路,变为艺术
  • 对于PWN而言,逆向工程的主要作用是发掘和分析漏洞

漏洞的一般形式——溢出(程序设计者设计时的不足所带来的错误)

缓冲区溢出(Buffer Overflow)

通常方法:覆盖指针

  • 堆溢出
  • 栈溢出
  • bss溢出
  • data溢出

wellpwn,AliCTF 2016 vss,Hitcon 2015 readable,stkof,zerostorage

整数溢出(Integer Overflow)

  • 无符号型与有符号型的转换

MMACTF 2016 shadow

  • 整数加减乘除法,如malloc(size*2)

pwnhub.cn calc

  • 整数溢出通常会进一步转换位缓冲区溢出,逻辑漏洞等其他漏洞

格式化字符串(Format String)

  • printf(s),sprintf(s),fprintf(s)等可能会导致任意地址读写

MMACTF 2016 greeting

  • 可以用来leak

HCTF 2016 fheap

释放后使用(Use-After-Free)

  • 释放掉的内存可能会被重新分配,释放后使用会导致重新分配的内存被旧的使用所改写
  • Double free 是一种特殊的UAF

逻辑漏洞

  • 访问控制,协议漏洞,多线程竞态条件(fakefuzz)等

漏洞挖掘中的逆向技巧

关键把握数据结构分析

  • 结构体
  • 接口

控制流分析

  • 理清楚程序的执行逻辑,基本上要做到从反汇编代码到源码的还原

数据流分析

  • 理清楚数据流向

CTF中漏洞挖掘中的分析策略

目标文件较小时

通常采用对整个文件进行控制流分析,做到整个程序从反汇编到接近源代码级别的还原,还原的时候也可以查找漏洞

目标文件较大时

逆向整个文件所需工作量太大,通常需要额外关注数据流,理清楚数据流所经之处的控制流逻辑,因为漏洞的触发与数据流离不开关系。

注意事项

  • 无论是数据流分析还是控制流分析,还原结构体,接口,类都会促进逆向工程
  • 在分析控制流的时候,根据程序对内存块的操作方法,还原出结构体,对于不知道的域先填写unknowk

控制流分析——理清程序逻辑

  • 目标文件较小,一般整体理
  • 代码以识别为主,不要硬逆
  • 熟悉常见的数据结构,算法在目标文件中“长啥样”(链表,树,图,堆,各种加密算法等)
  • RE工程(逆向工程)是一个经验性工作,刚开始慢慢来,逆多了就会有所感悟
  • 善用标记,标记结构体,变量名,变量类型
  • F5大法好,但不是万能的,当发现F5结果诡异时需要在汇编层分析
  • 熟悉各类漏洞

数据流分析

  • 目标文件较大,全盘RE不现实
  • 追溯用户输入的走向,重点关注对用户输入数据处理的函数
  • 可以在不用理清控制流的情况下即可找到漏洞,需要一些技巧

你可能感兴趣的:(CTF学习笔记)