PWN-0x01 栈溢出
目的:get shell ( sh )
0x01 栈的工作原理
栈:一种先入后出的数据结构
被用于函数的局部内存管理(局部变量、调用信息)
栈往低地址方向增长
esp永远指向栈顶
1 | push ebp #把ebp的值压入栈顶 esp=esp-4 |
Operation | Stack | |
---|---|---|
<–栈底(高地址) | ||
push 0xdeadbeef | 0xdeadbeef | <–栈顶(低地址) |
0x02 保护机制
checksec
NAME | |
---|---|
ALSR | 堆栈、libc的地址发生变化 |
PIE | 代码段和数据段地址随机化(在ALSR开启的情况下才有效) |
cannary | 比ebp低一位:ebp-0x4(32bit) ebp-0x8(64bit) |
NX | 数据内存页不可执行 |
ALSR:
查看ALSR配置
cat /proc/sys/kernel/randomize_va_space
0 = 关闭
1 = 半随机。共享库、栈、mmap() 以及 VDSO 将被随机化。
2 = 全随机。除了1中所述,还有heap。
root用户下关闭ALSR
echo 0 > /proc/sys/kernel/randomize_va_space
PIE:
默认编译关闭
开启pie进行编译:
gcc -fpie -pie -o test-pie test.c
关闭cannary:
-fno-stack-protector
0x03 一般方法
gets(a);
scanf(“%s”,a);
1 | STACK #STACK中,下面是高位,上面是低位 |
用垃圾字节爆栈
gdb-peda$ pattern create 100 每个字节都是唯一的,方便定位
看eip里存入的值 eg.: A)AA
*gdb-peda$ pattern offset A)AA * 看之前存了多少个垃圾字节
1 | from pwn import * |
p8–1byte–8bits
小端序解析
0x04 gdb 指令
tip:gdb doesn’t open a process literally
指令 | 用途 |
---|---|
info function | 查看程序调用的函数 |
disassemble | 反汇编 |