pwn basic

栈溢出常见利用方式

ret2text

ret2syscall

ret2shellcode

ret2libc

ropchain

栈溢出防护

canary

  • CANNARY(栈保护) –金丝雀 又称为stack guard
    1
    金丝雀,以前矿工进入矿坑时候会带一只金丝雀下去,如果矿坑内有有毒气体,金丝雀就会鸣叫甚至死亡,同样这个canary也是缓冲区溢出攻击一种检测手段,当启用栈保护后,函数开始执行的时候会先往栈里插入cookie(金丝雀)信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。

DEP

  • NX(DEP)(数据执行保护 Data Execution Prevention)
    1
    2
    NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
    可执行的地方不能写,可写的地方不能执行

ASLR

1
2
3
4
5
6
7
8
9
内存地址随机化机制(address space layout randomization),有以下三种情况:

0 - 表示关闭进程地址空间随机化

1 - 表示将mmap的基址,stack和vdso页面随机化

2 - 表示在1的基础上增加堆(heap)的随机化

每次程序执行时,stack heap library的位置都不一样

PIE

  • PIE (Position Independent Execution)
    1
    开启后,code与data都会跟着ALSR

RELRO

1
2
3
4
5
6
7
8
9
10
11
Relocation Read-Only

Partial RELRO

GOT可写

Full RELRO

Load time 时会将所有function resolve完毕

GOT不可写

got hijacking