美文网首页网络安全实验室
格式化字符串绕过canary入门

格式化字符串绕过canary入门

作者: 蚁景科技 | 来源:发表于2018-11-27 10:18 被阅读32次

知识

格式化字符串漏洞是因为c语言中printf的参数个数不是确定的,参数的长度也不是确定的,当printf把我们的输入当作第一个参数直接输出的时候,我们输入若干格式化字符串,会增加与格式化字符串相对应的参数,会泄露出栈中的内容Canary的工作原理就是子函数在做自己的事情之前,在自己的栈帧里返回地址之前插入一个随机的cookie,从gs:0x14的地方取出来,然后在函数返回之前对比栈中的这个随机值和gs:0x14来断定是否发生栈溢出,常用的对canary的绕过方法有通过格式化字符串泄露canary,劫持__stack_chk_fail,覆盖argv[0]等等,这里我们有格式化字符串漏洞,就直接用格式化字符串泄露出canary

思路

首先打开程序如上图有两个输入点,首先让我输入我的名字,我输入了两个%p做测试,果然打印出了两个十六进制的字符串,然后第二次让我留言,输入超长字符串会提示你栈溢出了

用ida简单看了一下逻辑,就是让你输入名字,然后调用get_message函数输出你的名字,然后让你留言,留言有溢出漏洞,显然用了printf,也有格式化字符串漏洞

检查一下程序开启的保护措施以及其他一些常规的东西

32位程序,只开启了Canary,所以我们可以用格式化字符串漏洞泄露出栈上保存的Canary,没有开启NX,说明堆栈可执行,我们可以在第二次输入中直接把shellcode布置到栈里面,然后返回到栈里面

下面是get_message函数的反汇编代码

chars到返回地址之前一共是0x70+4即116个字节即29个dword

不要问我为啥,我喜欢以四字节为单位

payload可以构造为如下形式

这是第二步溢出的思路

在这之前我们要先通过格式化字符串漏洞泄漏出canary和我们shellcode的地址,这里计算canary相对于printf第一个参数的偏移的话,不用算,有技巧。先生成格式化字符串

再附加调试器,在moveax,gs:0x14处下一句下断点,运行以后输入生成的格式化字符串。会断在下一句,这时候记下eax的值,然后输入c继续运行,复制输出的字符串

在python里index一下就好了如下图

mov   eax,gs:0x14

mov    DWORD PTR [ebp-0xc],eax

从上面的汇编代码里看出来ebp前面第0xc即12个字节是canary的开头

所以当前栈帧地址也可以通过刚才的方法泄露出来,直接用canary的index+3便可

获取到ebp的地址,计算我们的shellcode地址,注意获取到的ebp是上一个栈帧的ebp

所以我们看上一个栈帧的空间再跳过ebp和返回地址就是我们的shellcode了

gdb调试可以看出两个栈帧距离为0x90(pushebp的时候地址减去内容便可),在跳过ebp和返回地址0x8字节

0x2a8-0x218=0x90

exploit

题目放在了百度网盘,

链接:https://pan.baidu.com/s/1jDVh637xVIBvu8RhgB9Umw 

提取码:g7bx


本文为原创文章,转载请注明出处!

相关文章

  • 格式化字符串绕过canary入门

    知识 格式化字符串漏洞是因为c语言中printf的参数个数不是确定的,参数的长度也不是确定的,当printf把我们...

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

    Canary主要用于防护栈溢出攻击。我们知道,在32位系统上,对于栈溢出漏洞,攻击者通常是通过溢出栈缓冲区,覆盖栈...

  • PWN之canary骚操作

    最近做题遇到一些canary的保护的题目,于是想着搜集整理一波有关绕过canary的操作。 Canary保护机制的...

  • 西湖论剑2019pwn签到题

    main函数 输入id有一个格式化字符串漏洞 因为程序开启了canary保护,所以只能先通过printf泄露can...

  • XMAN结营赛总结

    once_time 这题主要利用了格式化字符串的漏洞,另外有canary的保护,需要用到栈溢出报错的函数具体的利用...

  • 格式化字符串pwn200

    2017湖湘杯pwn200,还是比较经典的格式化字符串例题 先查看一下保护机制: 32位开启了canary和堆栈不...

  • Canary机制 -格式化字符串漏洞

    一.canary相当于一个标志当修改程序时,会发现程序是否被修改。注: 找到canary偏移地址,填充打印出ca...

  • 栈溢出--canary简单绕过

    canary简介 Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次...

  • Python基础(18) - 字符串格式化与模板字符串方法

    字符串格式化的各种方法 格式化字符串的方法 使用%格式化 模板字符串 字符串的format方法 fstring 什...

  • noxctf-2018-wp

    pwn1-believeMe x86 elf | nx , stack canary 漏洞点:40个字符内的格式化...

网友评论

    本文标题:格式化字符串绕过canary入门

    本文链接:https://www.haomeiwen.com/subject/ghnwqqtx.html