[原理分析]Linux下的栈溢出案例分析-GDB调试操练[4]

摘要:

本系列的3介绍了现有的linux系统对栈的保护,在那种栈保护措施下,要修改SIP(saved instruction pointer)不可能;但是栈保护对象有限,对程序中的数据不一定都能保护到。本文就是探讨程序中有内存操作漏洞时,如何利用漏洞改写数据,达到控制的目的。

测试平台:

1. ubuntu 9, gcc4.4.1, gdb 7.0

2. ubuntu系统安装在virtualBox 3.2.8系统上;

正文:

首先看个如下的示例代码:

#include<stdio.h>
#include<stdlib.h>

int main(){
	printf("hello world\n");
	sleep(1000);
	return 0;
}

该代码中主要是调用了两个标准库函数,下面是其反汇编代码:

如果仔细看的话,我们发现对于puts以及sleep的调用不是转入函数的入口,而是在call指令处通过一个额外的jmp来实现跳转,比如call 0x8048320处的指令时jmp *0x804a004,最后跳转处的地址存放在0x804a004中。我们可以认为一个程序中的用到库函数接口会对应一相应的表格,表格中存放着对应的库跳转地址,如下的表结构:

0x8048a004:
库接口1的跳转地址;

0x8048a000:
库接口1的跳转地址;

0x8048fffb:
库接口1的跳转地址;

理解上述原理后,如果能修改上述库跳转表格中的地址,那么我们就能控制程序的跳转。仔细看下面的代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

#define SIZE 12
#define MAX  20

typedef struct node{
	char buf[SIZE];
	void* next;
}node;

void hax(){
	execl("/bin/echo", "echo", "hello", NULL);
}

void readFile(char* file, char* buf){
	FILE *fd = fopen(file, "r");
	if(fd == NULL){
		printf("open error\n");
		exit(-1);
	}
	fread(buf, 1, MAX, fd);
	printf("read data2 %s\n", buf);
	fclose(fd);
}

int main(){
	char buf1[MAX+1];
	buf1[MAX] = '\0';
	readFile("data1.dat", buf1);

	char buf2[MAX+1];
	buf2[MAX] = '\0';
	readFile("data2.dat", buf2);

	node data1, data2;
	data1.next = &data2;
	data2.next = &data1;

	memcpy(&data1, buf1, MAX);//MAX or SIZE, I think it should be SIZE;
	memcpy(data1.next, buf2, SIZE);

	exit(-1);
	return 0;
}

上述代码中主要是两个数据节点,采用循环链表的方式链接在一起。上述代码中,主要的漏洞在于main函数中的第一个memcpy操作,其中的赋值超过buf的SIZE。利用这个漏洞,如果我们在data1.dat的输入文件中,将data1.dat中的next值替换为exit()函数对应的库跳转表地址值0x0804a024。然后,再将hax()(我们要替换exit的函数)的地址写在data2.dat文件中,该地址会通过第二个memcpy操作替换掉0x0804a024处原来的值,然后程序运行到exit后,就会执行我们的hax函数。下面是hax的地址:

下面是两个输入文件data1.dat和data2.dat中的数据:

data1

data2

data1中的主要设置是前面的12个字节存放‘A‘数据,最后跟上exit的表地址;而data2的前四个字节是hax()函数的入口地址,后面的四个字节只是保存了下exit的表地址中存储的原值。设定完这些文件后,运行程序,可以看到我们的设定的确发生作用,hax被调用了:

结束语:

本文展现如何对数据进行修改从而达到控制程序执行流程的案例。该案例主要基于内存漏洞,造成漏洞的主要原因在于内存拷贝时的越界。

参考文献:

《现代Linux系统中的栈溢出攻击》

时间: 2024-07-30 09:18:41

[原理分析]Linux下的栈溢出案例分析-GDB调试操练[4]的相关文章

[原理分析]Linux下的栈溢出案例分析-GDB调试操练[3]

摘要: 本文主要在之前版本的代码基础上,分析下gcc如何进行栈保护以避免栈溢出攻击的. 测试的平台: 1.  ubuntu 9;   gcc 4.4.1;   Gdb 7.0-ubuntu 2.  ubuntu系统安装在virtual box 3.2.8虚拟机上: 正文: #include<string.h> void overflow(char* arg) { char buf[12]; strcpy(buf, arg); } int main(int argc, char *argv[])

[原理分析]Linux下的栈溢出案例分析-GDB调试操练-加强版

摘要: 原来的版本:http://blog.csdn.net/bigbug_zju/article/details/39892129 原版本中的问题主要在于调试过程中,蛮力的痕迹太重,没有很好地体现常用的调试准则:本文在原版本的基础上,融入参考文献中提及的调试原则,重新审视和操练该问题,希望尽量体现出调试中常用的思维法则. 测试的平台: 1.  ubuntu 9;   gcc 4.4.1;   Gdb 7.0-ubuntu 2.  ubuntu系统安装在virtual box 3.2.8虚拟机上

Linux下的栈溢出案例分析-GDB调试操练

摘要:  本文主要演示linux平台下的栈溢出,首先根据理论对示例代码进行溢出攻击:结果是溢出攻击成立,但是与设想的有差别:然后采用GDB调试工具对发生的意外,进行深入的分析. 测试的平台: 1.  ubuntu 9;   gcc 4.4.1;   Gdb 7.0-ubuntu 2.  ubuntu系统安装在virtual box 3.2.8虚拟机上: 示例代码如下: #include<string.h> void overflow(char* arg) { char buf[12]; str

Linux服务器挂死案例分析

问题现象: 在linux服务器上运行一个指定的脚本时,就会出现无数个相同进程的,而且不停的产生,杀也杀不掉,最后系统就陷入死循环,无法登陆,只能人工去按机器的电源键才可以.这够崩溃的吧? 问题分析过程: 在分析过程中发现这个特定的脚本有些特别,和系统中已有的命令的名字是相同的. 以free命令为例: 这个脚本名字就叫做free(后面没有带.sh),而且这个脚本文件里又去调用了free命令. 这个脚本的本意应该是要去调用free命令来完成一个任务. 那是否就是因为这样就会导致问题呢? 其实光这样是

linux下常用的日志分析命令

linux下常用的日志分析命令 本文介绍下,在linux中常用的一些分析日志的命令行或脚本,有需要的朋友参考下. 形如下面这样的access.log日志内容: 211.123.23.133 – - [10/Dec/2010:09:31:17 +0800] “GET /query/trendxml/district/todayreturn/month/2009-12-14/2010-12-09/haizhu_tianhe.xml HTTP/1.1″ 200 1933 “-” “Mozilla/5.

linux下简单抓包分析

有时候会遇到一些问题需要我们来抓包分析,当手头又没有专业的抓包工具的时候,可以用tcpdump来替代一下(一般的发行版都自带这个工具) 比如我们要分析一下eth0接口下跟192.168.7.188 这个目的IP地址22端口的发包情况 tcpdump -i eth0 dst 192.168.7.188 and port 22 tcpdump -i eth0 dst 192.168.7.188 and port 22 tcpdump: verbose output suppressed, use -

Java文件夹操作,判断多级路径是否存在,不存在就创建(包括windows和linux下的路径字符分析)

兼容windows和linux. 分析: 在windows下路径有以下表示方式: (标准)D:\test\1.txt (不标准,参考linux)D:/test/1.txt 然后在java中,尤其使用File对象在操作windows的路径时,非常的不好操作,因为不知道要用多少个斜杠“\”来表示. 斜杠“\”为转义字符(参考:http://www.cnblogs.com/EasonJim/p/6561576.html). 而java的File对象上无论是windows还是linux,输入的路径不管标

Linux下MySQL慢查询分析mysqlsla安装使用

说明: 操作系统:CentOS 5.X 64位 MySQL版本:mysql-5.5.35 MySQL配置文件:/etc/my.cnf MySQL 数据库存放目录:/data/mysql 实现目的:开启MySQL慢查询日志功能,安装使用MySQL慢查询分析mysqlsla 具体操作: 一.开启MySQL慢查询功能 mysql -u  root -p  #进入MySQL控制台 show variables like '%slow%';   #查看MySQL慢查询是否开启 set global slo

Linux下 USB设备驱动分析(原创)

之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB枚举过程:https://blog.csdn.net/go_str/article/details/80802452 USB其它概念: (1)usb是主从结构,usb的传输都是主机发起: (2)usb右四种传输类型:控制.批量.中断.实时传输. (3)usb数据是通过端点进行通讯的,0端点既能输入也