[原理分析]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[])
{
	if(argc > 1)
		overflow(argv[1]);
	return 0;
}

使用到的源代码如上所示,分别采用开启堆栈保护和不开启堆栈保护的方式编译源代码,默认的方式就是开启堆栈保护的,而要关闭堆栈保护,只要在gcc的编译器命中中加入"-fno-stack-protector"参数即可。我们采用gdb对两个版本的代码进行反汇编(具体命令参照本系列1),通过对比发现两者的main函数一致,没有差别,具体如下:

图1

通过查看overflow版本的反汇编,可以发现两者之间存在差别,具体的代码如下:

图2

图3

图3是开启堆栈保护后的代码,可以发现该版本中增加了堆栈保护的语句,其中主要的思想是在特定地方插入特殊字节,然后在退出函数前检查该位置的字节,如果发生改变,那么就认为发生栈溢出,下面的代码完成特定字节的设定:

Mov eax, gs:0x14
Mov [ebp-0xc], eax

然后在退出函数之前,对特定字符进行检查,具体代码如下:

Mov eax, [ebp-0xc]
Xor eax, gs:0x14

从原理上而言,栈保护还是很简单的。上面的代码中,字符的复制从0x18(省略前面部分)往低地址开始,而我们的特殊字符直接是放在0xc这个地方,0x18减去0xc大概有12个字节。这个0xc是否会随着buf的大小而发生改变,下面我们将buf[12]修改为buf[17],看看0xc或者0x18的值是否会发生变化?下面看图:

图4

图4中可以发现,特殊字节放的位置0xc并没有发生变化,而复制字符串的首地址发生改变,从原来的0x18修改为0x1d;0x1d-0xc刚好是17(十进制),也即随着buf的改变是复制地址的变化,并且保证复制起始地址与特殊字节所在位置的距离刚好是字符串的长度。

结束语:

从汇编代码来看,gcc提供的栈保护策略也不复杂。在知道保护原理后,我们如何来实现栈溢出攻击就是另外一个问题了。

时间: 2024-10-17 12:56:28

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

[原理分析]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> #in

[原理分析]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端点既能输入也