PWN选手的自我修养

i春秋上观摩Atum大佬对CTF的归纳,适合有一定基础、想要入坑PWN的玩家。先立flag:每一个用例,日后都会写writeup。

PWN选手的自我修养

基础知识

这些如果不会,还玩个毛的PWN。

寄存器

rsp/esp,pc,rbp/ebp,rax/eax,rdi,rsi,rdx,rcx

特性:后进先出
活在操作系统中的栈:

  • 内存的一片区间,栈型结构管理,高地址向低地址增长。
  • esp指向栈顶
  • push sth -> [esp]=sth, esp=esp-4
  • pop sth -> sth=[esp], esp=esp+4
  • 以栈帧切割,保存函数调用信息和局部变量

调用约定

函数调用: call, ret
调用约定: _stdcall, cdecl, fastcall, thiscall, nakedcall, __pascal
参数传递:取决于调用约定,x86默认从右向左,x64优先寄存器,然后用栈

  • call func -> push pc, jmp func
  • leave -> mov esp, ebp, pop ebp
  • ret -> pop pc

栈溢出的保护机制

  1. NX/DEP
  2. ASLR
  3. Stack Canary/Cookie
  4. PIE
  5. RELNO

栈溢出利用方法

  1. ROP
    • 用法
      • 第一次触发漏洞,通过ROP泄露libc的address(如puts_got),计算system地址,然后返回到一个可以重现触发漏洞的位置(如main),再次触发漏洞,通过ROP调用system(“/bin/sh”)
      • 直接execve(“/bin/sh”,[“/bin/sh”],NULL),通常在静态链接时比较常用
    • 资源
      • defcon 2015 qualifier: R0pbaby
      • AliCTF 2016: vss
      • PlaidCTF 2013: ropasaurusrex
  2. SROP
  3. BROP
  4. stack pivot
    • 用法
      • 存在地址已知且内容可控的buffer
        • bss段,由于bss段尾端常有大量空余空间,所以bss段尾端也往往是stack pivot的目标
        • 堆块,如果堆地址已泄且堆上的数据可控,那堆也可以作为stack pivot目标
      • 控制流可劫持
      • 存在劫持栈指针的gadgets
        • 如pop esp,ret,具体binary具体分析
    • 资源
      • EKOPARTY CTF 2016 fuckzing-exploit-200(基于栈溢出)
      • HACKIM CTF 2015 - Exploitation 5(基于堆溢出)
  5. ret2dl_resovle, fake linkmap绕过ASLR
  6. 低地址12bit不变,Partial Overwrite绕过ASLR
  7. leak canary,overwrite canary,改写指针与局部变量绕过stack canary
    • 用法
      • 以上所有套路,遇到stack canary均无效
      • 不覆盖stack canary,只覆盖stack canary前的局部变量、指针
        • 几乎不行,编译器会根据占用内存大小从小到大排列变量
        • 某些极限情况可以,一般都是精心构造的
      • leak canary
        • printf泄露,canary一般从00开始
      • overwrite canary
        • canary在TLS, TLS地址被随机化
  8. 溢出位数不够:覆盖ebp,Partial Overwrite

    • 用法
      -可以覆盖Func2的ebp,会影响到Func1的esp,进而影响func1的ip

      1
      2
      3
      4
      5
      6
      7
      8
      9
      Func1:
      call func2
      leave(mov esp ebp, pop ebp)
      ret(pop ip)
      Func2:
      stack overflow
      leave(move esp, ebp, pop ebp)
      ret(pop ip)
    • 资源

      • XMAN 2016 广外女生-pwn
      • Codegate CTF Finals 2015,chess

待续。。。

文章目录
  1. 1. PWN选手的自我修养
    1. 1.1. 基础知识
      1. 1.1.1. 寄存器
      2. 1.1.2.
      3. 1.1.3. 调用约定
    2. 1.2. 栈溢出的保护机制
    3. 1.3. 栈溢出利用方法
    4. 1.4. 待续。。。
,