LINUX安全--构造数据实现缓冲区溢出
2016-04-14 00:05
489 查看
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *file[2] = {"superman.txt","batman.txt"};
char email[128];
char* cat_file(char *fileName){
FILE *fp;
char *content = (char *)malloc(40);
memset(content,0,40);
fp = fopen(fileName,"rb");
fscanf(fp,"%40s",content);
fclose(fp);
printf("the content is:%s\n",content);
return content;
}
int main()
{
int i = 0;
char *temp = NULL;
char *file_content = NULL;
char buf[140];
while(i<2)
{
temp = file[i];
file_content = cat_file(temp);
printf("What's this?\nguess: ");
scanf("%s",buf);
if(strcmp(buf,file_content))
{
puts("Bad luck!");
continue;
}
i++;
puts("Hey you are so smart!");
}
puts("Congratulatinons! You Guessed everything!");
printf("input you email");
scanf("%s",email);
puts("Thank you so much! I will send you a gift,bye!");
return 0;
}
实验目录:
实验的要求:
通过构造数据进行溢出,读取flag.txt的内容
实验过程:
实验主要的思路就是在buf里面添加字符串,产生缓冲区溢出,进而将main函数的返回地址覆盖为cat_file,进而实现函数跳转,实现输出flag.txt
实验步骤
1.分析函数的栈的情况
对exc.exc文件进行gdb调试
查看main函数的汇编代码,并在如图所示的地方设置断点
我们在0x08048661和0x0804866c处设置断点进行调试确定栈的整体结构,所以栈的结构应该是这样子的
、
由于程序每次在输入buf时候总会和content_file进行比较如果不相同就会一直陷入死循环,因此我们在进行缓冲区溢出时主要的工作是首先要将i的值覆盖,其次将main函数的返回地址覆盖以及cat_file参数的输入。
对于将i的值进行覆盖首先我们通过分析可以得出变量i的地址为:0xbffff36c
main函数的返回地址为:0xbffff378
cat_file的地址为:0x080485dd
因为cat_file是有参数的,我们参数压入的方法主要是通过代码
来实现的,查看汇编代码,可以看到
地址为0x0804a080
基本是相关的参数已经确定接下来我们构造shellcode
shellcode如下:'a'*0x8c+l32(0x08048800)+'a'*4+l32(2)+'a'*12+l32(0x080485DD)+l32(0)+l32(0x0804A080)
编写python文件如下:
运行查看效果:
总结此次试验与之前做的缓冲区溢出不太一样的地方就是return和call指令,压入参数的方式不同
call指令只要是push+jmp
而return指令则不一样,如图:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *file[2] = {"superman.txt","batman.txt"};
char email[128];
char* cat_file(char *fileName){
FILE *fp;
char *content = (char *)malloc(40);
memset(content,0,40);
fp = fopen(fileName,"rb");
fscanf(fp,"%40s",content);
fclose(fp);
printf("the content is:%s\n",content);
return content;
}
int main()
{
int i = 0;
char *temp = NULL;
char *file_content = NULL;
char buf[140];
while(i<2)
{
temp = file[i];
file_content = cat_file(temp);
printf("What's this?\nguess: ");
scanf("%s",buf);
if(strcmp(buf,file_content))
{
puts("Bad luck!");
continue;
}
i++;
puts("Hey you are so smart!");
}
puts("Congratulatinons! You Guessed everything!");
printf("input you email");
scanf("%s",email);
puts("Thank you so much! I will send you a gift,bye!");
return 0;
}
实验目录:
实验的要求:
通过构造数据进行溢出,读取flag.txt的内容
实验过程:
实验主要的思路就是在buf里面添加字符串,产生缓冲区溢出,进而将main函数的返回地址覆盖为cat_file,进而实现函数跳转,实现输出flag.txt
实验步骤
1.分析函数的栈的情况
对exc.exc文件进行gdb调试
查看main函数的汇编代码,并在如图所示的地方设置断点
我们在0x08048661和0x0804866c处设置断点进行调试确定栈的整体结构,所以栈的结构应该是这样子的
、
由于程序每次在输入buf时候总会和content_file进行比较如果不相同就会一直陷入死循环,因此我们在进行缓冲区溢出时主要的工作是首先要将i的值覆盖,其次将main函数的返回地址覆盖以及cat_file参数的输入。
对于将i的值进行覆盖首先我们通过分析可以得出变量i的地址为:0xbffff36c
main函数的返回地址为:0xbffff378
cat_file的地址为:0x080485dd
因为cat_file是有参数的,我们参数压入的方法主要是通过代码
来实现的,查看汇编代码,可以看到
地址为0x0804a080
基本是相关的参数已经确定接下来我们构造shellcode
shellcode如下:'a'*0x8c+l32(0x08048800)+'a'*4+l32(2)+'a'*12+l32(0x080485DD)+l32(0)+l32(0x0804A080)
编写python文件如下:
运行查看效果:
总结此次试验与之前做的缓冲区溢出不太一样的地方就是return和call指令,压入参数的方式不同
call指令只要是push+jmp
而return指令则不一样,如图:
相关文章推荐
- 每天一个linux命令(22):find 命令的参数详解
- CentOS安装Maven
- 查看win或者Linux端口是否被占用
- 浅谈Linux进程调度过程
- CentOS查看内核版本,位数,版本号
- Android 用到的Linux命令
- Linux常见目录作用
- centos 挂载与卸载硬盘
- [Linux]nvidia optimus在linux下使用
- 几个Linux常见命令
- Linux内核参数 /etc/sysctl.conf 功能说明
- 1.1.1 Linux是什么
- 《Linux内核分析》课程第八周学习总结
- full backup of Linux OS
- 1.1 Linux是什么
- Ubuntu下建立openwrt-linux交叉编译环境
- arm9+linux fl2440 实现RT3070无线网卡AP模式并使开发板接入Wifi上网
- linux内核I2C子系统学习(三)
- 20135302魏静静——linux课程第八周实验及总结
- ubuntu使用下载的deb文件制作本地源