PWN题型之对抗Canary技术

2023-11-10 19:59
文章标签 技术 对抗 题型 pwn canary

本文主要是介绍PWN题型之对抗Canary技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 0x1 :什么是Canry保护
  • 0x2 :对抗思路
  • 0x3 :格式化字符串漏洞
  • 0x4 :smashing技术的利用
    • 基础知识 :
    • 流程图 :
    • 实例分析 :
  • 0x4 :劫持_stack_chk_fail函数
  • 总结

前言

参考资料:

b站:https://www.bilibili.com/video/BV1Yf4y197Wi?p=5 漏洞利用的方式讲了很多,不过需要掌握基础知识
看雪:https://www.kanxue.com/book-57-857.htm jin讲了原理,讲了如何运行调试,适合新手,不过要收费。


0x1 :什么是Canry保护

想必大家已经做了一些最基本的栈溢出题目,它们利用的就是你输入的大小大于它所能存储的大小,然后来覆盖ebp,进而修改返回地址来达到目的。然而随着这种漏洞的产生,相应的就产生了阻止这种漏洞利用的方式,于是后面就出现Canary保护机制,它的出现导致了栈无法直接溢出了。那么Canary保护到底是怎么进行的呢?
在这里插入图片描述

Canary保护:在当你覆盖ebp之前时会进行一个验证,这个验证的内容是之前传入的,如果这个内容与之前的不一样,那么它就会跳转到一个叫_stack_chk_fail的函数当中,就不会向下溢出覆盖返回地址,导致直接的栈溢出无法实现。下面就以一个实际的程序为例详细谈谈。

下图是开启Canary保护 的一个程序 的反汇编的main函数 的代码,
在这里插入图片描述

首先可以看到把 fs段的0x28 先存放到rax当中 然后保存到[rbp-0x8]里面。rbp-0x8是什么?它不就是的就在rbp上面一个的一个位置吗,如果你的填充了溢出的话是就会导致rbp-8位置的数值发生了改变。

在出栈的时会进行一个判断:它将之前存放到[rbp-0x8]里面的内容存放到rdx当中,与之前的fs段的0x28进行xor异或判断,如果相等的话就执行je跳转到<main + 94>,如果不相等就会执行call指令,就会跳转到_stack_chk_fail函数当中。

关于跳转的过程(xor 和 je指令)再在这详细谈一谈
xor命令:异或,如果a、b两个值相等则为0,不同则为1
je指令:只在 ZF = 1的时候才会跳转,跳转到leave指令当中,才能避免执行call指令


在这里插入图片描述
ZF又是什么?上面是eflag标准寄存器的低16位的结构,每一个标志位都有其专门的含义。ZF是其中的的一个标志位==>0标准位,作用是判断前面那条指令是否为0,若为0则为真即ZF = 1,若不为0则为假即ZF = 0。

结合前面的所以内容可以得到的是:
在这里插入图片描述

另外再给出一种确定ZF标志位的值的方法:

查看执行xor命令以后的标志位寄存器的数值,然后将该数值转换成二进制,ZF标志位在第七位上,然后看该二进制的第七位是0还是1。(在gdb中用 i r 命令查看寄存器里面的内容)。同样也可以得到相同的结果。
这是正常情况下的执行了xor命令后的eflag寄存器的情况,
在这里插入图片描述

在这里插入图片描述
可以发现第七位的结果为1,所以ZF = 1,可执行je指令

这是溢出并修改了Canary值以后的标准寄存器:
在这里插入图片描述
在这里插入图片描述
可以发现ZF = 0,所以就会导致je不跳转,执行call命令。



0x2 :对抗思路

既然是添加了一个判断的数值,那么我们该怎么样来绕过这个保护机制呢?下面讲讲利用思路,对于有些的实现我还是存在不少问题。

(1)直接泄露Canary的值,比如你第一次溢出的时候知道了该Canary的值,然后第二次溢出时你原封不动的填充进去不就可以。或者是利用某些漏洞的任意读的功能(像格式化字符串漏洞就有任意的读的能力)来读取Canary的值然后改写以此来通过它的校验。
在这里插入图片描述

(2)直接泄露fs : 0x28内的数值,Canary的校验不是最开始是由fs : 0x28决定的吗。这里同样可以利用某漏洞任意读的功能,那么我们就可以读取fs : 0x28位置里的内容。如果我们存在任意读,并且已经算出来libc的基址时是可以计算出这个位置的地址的,fs : 0x28的地址和 libc里面的基地址的偏移是一样的,是你每次电脑重启之后都是一样的。
在这里插入图片描述

(3)直接改掉fs : 0x28里面的数值,这样Canary的值想是什么就是什么了。

(4)劫持_stack_chk_fail函数,失败不是会跳转到_stack_chk_fail函数里面吗?这样那么就利用这个函数里面的漏洞直接泄露flag的地址。(具体的我在下面会进行讲解),

(5)stack smashing技术泄露内存地址(详细内容请看下文)




0x3 :格式化字符串漏洞

等我写完这个漏洞的利用后就附上链接,




0x4 :smashing技术的利用

基础知识 :

首先我们需要讲讲这个_stack_chk_fail这个函数,这个函数的源代码就不讲了,就谈谈这个函数的功能,它会将参数argv[0]的内容打印输出,而在里面存放的内容正好是这个程序的名字。如下图,只要溢出覆盖跳转了就会打印下面带*的那一行
在这里插入图片描述
那argv到底是什么?大家都知道main函数吧,我们是不是就是直接int main(),实际上main函数是有参数的,这个参数可以认为是main函数的形式参数,c语言规定main函数的参数只能有两个,一般写为argc和argv。argc参数表示了命令行中参数的格数。注意:文件名也算一个参数。这就导致了argv[0]的第0个参数里的内容是这个文件的名字。

打印argv[0]处的内容,那如果我们能够修改这个地方的值,改成读取的flag的地址,那么我们是不是就可以直接看到flag的内容了,而我们需要的是知道这个参数的位置在 输入时 距离栈顶的长度,这样你输入时,一直向下覆盖,然后覆盖成其他地址就可以打印出其他内存地址的信息了。



流程图 :

在这里插入图片描述

前提条件:

(1)存在溢出条件。

(2)存在flag.txt文件(应该是要打开的)。

说明: 其实这个并不只是可以泄露flag文件里面的内容,你也可以泄露其他地址的内容,然后与其他漏洞结合起来。




实例分析 :

题目来源: jarvisoj里面的Smashes

程序分析:64位程序,开启了Canary保护、NX保护、fortify保护。打开IDA,查看一下源代码
在这里插入图片描述
代码分析:存在一个gets函数输入v3的值,但是由于存在Canary保护,显然不可以直接溢出了。接着看,可以发现printf函数将v3的内容打印出来了,接着用f12可以看到存在CTF这样flag的字样,就是我们需要读取的内容,不过本地和服务器上面的具体内容显然是不一样的。

接下来就是找到argv距离esp的距离了,打开gdb,下断点到getc函数处。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
也就是说你从rsp到你要修改的地方距离536个字节,中间的536填充随机数。接下来就是找到flag的文件的地址了,修改成ida里面的那个flag地址,但是发现并未泄露出flag,后面才知道程序执行过程中修改了flag。但是这里需要注意的是flag文件它有可能会被封,然后打开gdb查看一下
在这里插入图片描述
果然存在,所以只要我们覆盖的地址改成0x400d2就可以读取flag了。
exp:

from pwn import *#r = process('./smashes')
r = remote("pwn.jarvisoj.com",9877)flag_addr=0x400d20                                                                                              
payload='a' * 536 + p64(flag_addr)r.recvuntil("What's your name? ")
r.sendline(payload)r.recvuntil("Please overwrite the flag: ")
r.sendline("aaaa")
r.interactive()

这里有一个坑我找了半天(具体是为什么我暂时还不知道),这个flag地址是0x400d20 而不是0x400d20 ,地址是21的话会少一个P,然后我还以为一直是对的。
在这里插入图片描述




0x4 :劫持_stack_chk_fail函数




总结

这篇关于PWN题型之对抗Canary技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384909

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m