TCTF 2019 公开课 - Pwn 从入门到进阶

TCTF 2019 公开课全记录 https://live.freebuf.com/detail/55ff04f5034df8fd6e82e2231b3d152d

准备

1.基本工具的使用

  • GNU binutils
  • 静态分析工具

    • ida
    • Ghidra
  • 调试器

    • linux: gdb
    • Windows: WinDbg、x64dbg

2.基础的体系结构知识
3.英文阅读能力

信息收集

file : 识别待分析文件的格式、目标平台、目标指令集
ltrace :打印出库函数调用、识别待分析文件的输入点

checksec: 识别待分析的文件开启的安全保护

阅读源代码

  • 目的

    • 理解程序的用途和实现方式
  • 要求

    • 需要理解对应的编程语言
    • 需要理解实现的重要数据结构和算法
    • 需要理解模块间的数据流/控制流联系
  • 了解高级语言对应的内存布局方式(如C++类的内存布局
  • 两种方法

    • 自顶向下

      • 从程序开始执行的地方看 (无源代码 _start
      • 从输入点开始跟踪
    • 自底向上

      • 找到关键函数/变量,交叉引用
  • 搜集设计文档,正向理解开发思路
  • 搜集参考资料、学习背景知识
  • 调试

寻找关键点

  • 字符串搜索
  • 结合对算法和数据结构的理解、对应函数变量名来确定关键点
  • 找到库函数、系统调用的代码

    • ltrace
    • strace
  • Magic Number

    • 例如搜索‘qshs’常量来查找解析SquashFS头的代码

常见漏洞类型

  • 逻辑错误
  • 内存破坏

    • 栈溢出
    • 整数溢出
    • 格式化字符串
    • 堆溢出
    • ...
  • 硬件实现漏洞

漏洞挖掘方法

  • 静态分析

    • 代码审计

      • 手动
      • 自动:Coverity/Fortify ( all 昂贵
    • 逆向分析
  • 动态分析

    • 模糊测试(Fuzzing

      • AFL/Libfuzzing
    • 符号执行(Symbol excution

      • klee/s2e/angr
    • 调试

代码审计

  1. 确定攻击面

    • 查找相关API调用 (关注输入模块处理
    • 查找协议中的关键词

缓冲区溢出漏洞定位

  • grep(或使用IDA中的X)寻找危险函数调用、例如strcpy/sprintf/sscanf/...
  • 检查内存拷贝函数(memcpy/strncpy/snprintf/...)中的长度参数是否根据目标来指定
  • 关注循环中的赋值

整数溢出漏洞定位

  • 检查代码对输入(例如协议中的整数字段)中的整数处理
  • 有符号与无符号的转换和比较是否符合开发者预期
  • 整数的截断是否安全

格式化字符串漏洞定位

  • grep(或使用IDA中的X)寻找并检查相关函数调用、例如printf/sprintf/snprintf/
  • 检查格式化字符串是否可控
  • 格式化字符串的输入限制是否可以绕过(比如通过多次利用绕过

释放后使用(UAF)/多次释放漏洞定位

  • 基于全局的理解

    • 理解内存的管理方式
    • 何处分配释放
    • 分配大小是否可控
    • 分配/释放时机是否可控
  • 关注对象引用的分配和释放

    • 释放后是否做好清理工作
  • 关注对象的使用情况

    • 对象内部是否有函数表/函数指针

注:大多数UAF通过fuzz发现

思考

  • 注重基础

    • 数据结构、操作系统、计算机组成原理..
    • 理解演变

      • 保护方式的演变

        • aslr,nx,canary,full relro...
      • 利用方式的演变

        • ret2shellcode.ret2text,ret2libc...
    • 跳出思维定式

      • 尝试非传统的绕过方式
      • 接触不同层面的漏洞挖掘、利用

添加新评论

请不要水评论

评论列表