简单栈溢出

CANNARY(栈保护)
Cannary 是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻
击者可以覆盖栈上的返回地址让 shellcode 执行。启用栈保护后,函数开始执行时会在栈
上插入标志信息,当函数返回时验证标志是否被改变,如果改变就代表有攻击发生。
gcc -fno-stack-protector -o test test.c //禁用栈保护
gcc -fstack-protector -o test test.c //启用堆栈保护,不过只为局部变量中含有 char 数
组的函数插入保护代码
gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码

FORTIFY
gcc 增强保护的一种机制,防止缓冲区溢出攻击,不是太常见,它通过对数组大小的
判断替换 strcpy, memcpy, memset 等函数名,达到防止缓冲区溢出的作用

NX
将数据所在内存页标识为不可执行,当程序溢出成功转入 shellcode 时,程序会尝试
在数据页面上执行指令,此时 CPU 就会抛出异常,而不是去执行恶意指令

PIE(ASLR)
一般情况下 NX(Windows 平台上称其为 DEP)和地址空间分布随机化(ASLR)会
同时工作。内存地址随机化机制(address space layout randomization),有以下三种情

0 - 表示关闭进程地址空间随机化。
1 - 表示将 mmap 的基址,stack 和 vdso 页面随机化。
2 - 表示在 1 的基础上增加栈(heap)的随机化。
可以防范基于 Ret2libc 方式的针对 DEP 的攻击。ASLR 和 DEP 配合使用,能有效阻止攻击
者在堆栈上运行恶意代码

RELRO
设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对
GOT(Global Offset Table)攻击
在这里插入图片描述
-no-pie 执行程序会在固定的地址开始加载
-fno-stack-protector 关闭栈保护
-z execstack 栈数据可执行
-m32 32 为程序

func()函数中的 read()用于文件描述符对应的文件中读取数据,原型:
ssize_t read(int fd,void*buf,size_t count)
fd:文件描述符,从 command line 读取数据时为 0
buf:读出数据的缓冲区
count:每次读取的字节数

添加可执行:chmod +x 文件名

查看相关保护
在这里插入图片描述
查看相关函数
在这里插入图片描述
也可以用 IDA 分析

在这里插入图片描述
在这里插入图片描述
EBP(扩展基址指针寄存器)、ESP(堆栈指针寄存器,指向栈的栈顶)
申请 0x24(36 字节)空间:<+4>: sub esp,0x24
<+17>: sub esp,0x4
<+20>: push 0x50 ; read()第三个参数进栈
取真实有效地址放入 edx:<+22>: lea edx,[ebp-0x28]
压栈:<+25>: push edx

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
process 创建一个指定进程
offset 返回地址的偏移量
用 a 填充 ebp 和返回值之间的空白,p32 指 32 位地址
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值