软件安全实验——lab6(缓冲区溢出2:使用jmp esp或者call esp方法和修改函数指针)

Posted 大灬白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件安全实验——lab6(缓冲区溢出2:使用jmp esp或者call esp方法和修改函数指针)相关的知识,希望对你有一定的参考价值。

Task 1

下面的程序具有缓冲区溢出,利用jmp esp或者call esp进行溢出

/* stackesp.c */

/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
/* sudo sysctl -w kernel.randomize_va_space=2 then use jmp esp or call esp(no nops) */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//use jmp esp or call esp
int someint=0xe4ffd4ff; //e4ff 对应jmp esp, d4ff对应call esp
int bof(char *str)
{
   char buffer[12];
   strcpy(buffer, str);
   return 1;
}
int main(int argc, char **argv)
{
   char str[517];
   FILE *badfile;
   printf("%x\\n",&someint);
   badfile = fopen("badfile", "r");
   fread(str, sizeof(char), 517, badfile);
   bof(str);

   printf("Returned Properly\\n");
   return 1;
}

实验原理:
利用栈溢出,将bof函数堆栈帧中的返回地址覆盖为jmp esp or call esp指令的地址,CPU执行到返回地址处时,它会执行jmp esp or call esp指令,执行完这个指令之后,CPU会返回到被中断指令的下一条指令处接着执行,我把Shellcode放到这个被中断指令处,CPU就会执行Shellcode,从而实现我的攻击。

第一步:打开内存地址随机化

$sudo sysctl -w kernel.randomize_va_space=2

第二步:编译上面的程序为Set-UID程序,注意加上-fno-stack-protector进行编译

#gcc -z execstack -fno-stack-protector stackesp.c -o stackesp

设置Set-Uid

#chmod 4755 stackesp

第三步:bof的返回地址

进入gdb,对stackesp进行gdb,首先查看bof的起始位置和返回地址.

第四步:确定缓冲区的位置

为了确定缓冲区的位置,先在badfile里写入了AAAA

第五步:返回地址和缓冲区之间的距离

查看ESP之后,我们可以知道返回地址和缓冲区之间相差了6×AAAA个字节

所以我们再badfile中写入24个A来覆盖缓冲区,之后接上程序输出的jmp esp和call esp指令的地址0804a024 ,再接上shellcode

Task 2

/* overfun.c */

/* This program has a buffer overflow vulnerability. */
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int good(int addr) {
        printf("Address of hmm: %p\\n", addr);
}
 int hmm() {
        printf("Win.\\n");
        setuid(geteuid());
        execl("/bin/sh", "sh", NULL);
}
extern char **environ;
int main(int argc, char **argv) {
        int i, limit;
        for(i = 0; environ[i] != NULL; i++)
        memset(environ[i], 0x00, strlen(environ[i]));//将环境变量清空,所以这里不能用环境变量写入shellcode来攻击
        int (*fptr)(int) = good;//函数指针fptr指向good
        char buf[32];
        strcpy(buf,argv[1]);
        int (*hmmptr)(int) = hmm;  //函数指针hmmptr指向hmm
        (*fptr)((int)hmmptr);    //相当于good((int)hmmptr)传入hmm函数的地址
        return 0;
}

实验原理:
程序主要就是运行了good()函数(输出hmm函数的地址),我们目的就是将程序中指向good函数的fptr指针重定向为hmm,的这样程序就会执行hmm函数中的shellcode,从而获取root权限。

第一步:打开内存地址随机化

$sudo sysctl -w kernel.randomize_va_space=2

第二步:编译上面的程序为Set-UID程序,注意加上-fno-stack-protector进行编译

#gcc -z execstack -fno-stack-protector overfun.c -o overfun

设置Set-Uid

#chmod 4755 overfun

第三步:strcpy函数的返回地址

在main函数中找到strcpy函数的返回地址(0x0804964e),之后设置断点,(因为在strcpy函数之前,已经把good函数的地址赋给fptr指针了,我们首先就是要找到good函数的地址的位置)
输入AAAA并运行程序:

查看ESP之后,我们可以知道输入的字符串argv与good函数起始地址(0x08048554)之间之间相差了9×AAAA个字节

第四步:hmm函数的地址

写入36个字节来覆盖缓冲区,之后接上hmm函数的地址来代替good函数的地址,下面是三种找到hmm函数地址的方法

第五步:攻击

程序执行之后就会跳转到hmm函数,这样程序就会执行hmm函数中的shellcode,从而获取root权限。

以上是关于软件安全实验——lab6(缓冲区溢出2:使用jmp esp或者call esp方法和修改函数指针)的主要内容,如果未能解决你的问题,请参考以下文章

软件安全实验——lab5(Buffer_Overflow缓冲区溢出攻击)

软件安全实验——pre5(缓冲区溢出漏洞预习)

软件安全实验——lab9(缓冲区溢出:return-to-libc绕过非可执行堆栈)

20165214 朱文远 缓冲区溢出漏洞实验

缓冲区溢出实验与基础

使用Linux进行缓冲区溢出实验的配置记录