IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 栈溢出——cannary绕过方法详解 -> 正文阅读

[网络协议]栈溢出——cannary绕过方法详解

栈溢出保护及整数保护

说点什么

之前觉得学习原理很没有用,不如实践去执行

原理很多、很杂,很没用

真正去做时发现,原理是能做、不能做

从根本上指导实践,减少100%的试错时间

知行合一…

Canary原理

image-20220314185521681

Canary是在栈的尾部插入值,函数返回时检测canary是否改变,判断是否溢出

利用gcc编译:

gcc … -fstack-protector

image-20220314190213372

如果Canary检查到,会调用__stack_chk_failed函数

绕过:

image-20220314190450780

绕过方法1

image-20220314190852476

至少利用两次栈溢出,才可以使用绕过方法1

image-20220314191036897

V3后代表开启canary,所以v3是canary字节

第一次打印canary,第二次利用

buf距离ebp,10C个字节,v3距离ebp,C个字节,所以buf为100个字节

gdb:

dias main

disas vuln

image-20220314194309705

image-20220314194336984

这几个指令代表是有canary,

gdb可以创建随机字符

image-20220314194504474

image-20220314194527360

检测到栈溢出

利用gdb调试

image-20220314195825475

可以看到,canary的末尾值为00

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4NuXm0BJ-1647349943625)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220314195932905.png)]

可以看到,ebp-0xC即为canary值,

image-20220314200206762

0xffc66a68就是ebp的值,

0x08048695就是返回地址,所以canary后要有3个字节才是返回地址

image-20220314202033733

sendline函数会添加回车再发送,所以是0x101个字符

收到的4个字符就是canary,减去回车 0xa就是canary。

注意:回车会导致多输入一个字符

image-20220314202726993

Canary会随机变化,但是fork的函数中canary可以进行爆破

image-20220314203109994

绕过方法2

image-20220314202951273

调用多次的canary值和父进程完全一样,因此可以爆破

image-20220314204116793

先填充0x100个字节,接上cannary值,canary4个字节,所以最后1字节是0x00,前三个字节进行爆破,如果接收到被篡改那么输出信息

绕过方法3

image-20220314204542613

修改该函数的got表即可

image-20220314204636981

最多溢出到canary,不能覆盖到ebp与ret地址,所以要利用格式化字符串漏洞,将getshell函数转换到chk_fail函数的got表,使得栈溢出触发getshell函数。

image-20220314204949590

格式化字符串三点:改写的地址,写入的值,格式化字符串是第几个参数

image-20220314205245097

chk_fail函数之前没调用过,所以是plt的第二条指令

get_shel高字节与chk_fail相同,因此只需要改低字节

%%%dc实现输出addr-4个字符, addr-4是因为stack_chk_fail先输出,是4个字节

最后将前面参数对应的数字,写入到第7个参数(buf对应第几个)对应的地址

image-20220314210224795

绕过方法4

image-20220314211244030

image-20220314211419749

v4:buf大小是0x100

IO_gets就是gets,不限长度输入,以0字符截断,将flag地址进行覆盖

注意:本地的flag内容与远程的flag不相同!

找到chk_fail函数的argv[0]与flag地址的偏移,才能覆盖

image-20220314214635731

image-20220314214256226

64位因此参数传递是通过寄存器,rdi,rsi,rdx,rcx,r8,r9

ELF文件如果较小,会有多重映射

因此用find命令寻找字符串与地址

image-20220315125029254

找到初始地址,0x400d20,也就是要修改的地址

0x218是地址偏移,当执行stack_chk_fail时,就会把new_flag_addr的值输出出来

image-20220315125230451

绕过方法5

image-20220315130103464

canary初始值就是TLS结构中stack_guard,

修改stack_guard就可以绕过canary

image-20220315130238299

输入远大于 char s数组,可以溢出

gdb中如果没有 符号表(striped),调试不方便 ,但是可以结合IDA与gdb进行调试

image-20220315130832538

栈离TLS距离较近,则可以溢出

image-20220315131159384

image-20220315131421783

所以填充(TLScanary地址 - buf起始地址)的无用值

注意溢出时也会有canary,这个canary也要修改成一样的

这道题没有现成getshell,因此需要第一遍获取system地址,第二遍执行/bin/sh

image-20220315132128249

image-20220315131822193

利用read函数读入system函数,产生栈偏移到data段直接执行system函数,再构造read链,

read函数3个参数,因此填充

image-20220315132405406

pop_rdi_ret能够传递参数

leave指令将rbp移动到rsp,因此栈会偏移

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:56:30  更:2022-03-16 22:57:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:55:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码