PWN-1

0x00 what is pwn

1.控制程式流程,进而触发攻击

2.寻找漏洞

  • Fuzz模糊测试:自动产生随机输入来寻找漏洞
  • 看源码、组合语言找漏洞

3.拿到shell

0x01 program structure

overview

Text

  • 程序代码(binary) 组合语言
  • 可读 不可写 可执行

Data

  • 已经初始化的全局变量

BSS

  • 未初始化的全局变量

Heap

  • 动态记忆体空间
  • malloc() / free()
  • 由低位往高位长(下面低)

Stack

  • 存放暂存资料:局部变量、return address、参数、回传值
  • 由高位往低位长(下面高
  • top存在rsp
  • 先进后出
  • local variable
    local variable
  • return address
    return address
  • security options
    security options

Lazy Binding

  • Dynamic linking 的程序在执行过程中,有些library的函数可能到结束都不会执行
  • ELF 采取Lazy binding 的机制,在第一次call library 函数时,才回去寻找函数真正的位置进行binding

GOT & PLT

  • Global Offset table
  • GOT 为一个函数指针阵列,存了其他library 中的function 的位置,因为Lazy binding 的机制,所以一开始只会填上一段plt 位置的code
  • 第一次执行时,plt会呼叫 _dl_fixup(),才会去巡展真正的function 并填入GOT
  • 第二次以后执行时,直接通过GOT找到function 位置
    GOT & PLT -1
    resolve 就是找 read function的位置
    GOT & PLT -2

RELRO

  • RELocation Read Only
  • 三种状态:No / Partial / Full
    • No RELRO : link map 和 GOT 都可写
    • Partial RELRO : link map 不可写,GOT可写
    • Full RELRO : link map 和 GOT 都不可写

Stack Canary

  • 在 rbp 之前塞一个 random 值,ret 之前检查是否相同,不同的话就会 abort
    Stack Canary -1
  • 有 canary 的话不能覆盖到return address 、rbp
    Stack Canary -2

NX

  • No eXecute
  • 又称DEP(Data Execution Prevention)
  • 可写的不可执行,可执行的不可写

PIE

  • Position Independent Executable
  • 开启时,data段以及code段位址随机化 (Text + Data + BSS)
  • 关闭时,data段以及code段位址固定

ASLR

  • Address Space Layout Randomization
  • 记忆体位址随机变化
  • 每次执行时,stack、heap、library位置都不一样
  • ASLR时系统设定的,非程序设定的

0x02 Tools

overview

Tools

nc / ncat
nc/ncat
nc/ncat

objdump

  • dump 出执行档中的组合语言
  • 可以搭配 less/grep 使用
  • 范例
    objdump

gdb

  • 设断点(break)
    b main ```
    1
    ``` % b *0x4896aa 
  • 执行(run)
    r ```
    1
    2
    * 继续执行(continue)
    ``` % c
  • 下一行指令(next instruction)
    • 不会进入 call function,直接跳到同一区块的下一个指令
    • % ni
  • 下个执行的指令(step instruction)
    • 会进入 call function
    • % si
  • 跳到某个地址(jump)
    j *0x4896aa ```
    1
    2
    * 显示某地址的值
    ``` % x/10gx 0x400686
  • 设定某个地址/寄存器的值
    % set $rax=0x5

输入时没有控制输入长度,导致记忆空间被输入覆盖掉

通常发生在char字串的输入