Linux堆栈溢出的经典问题
Linux堆栈溢出的经典问题
声明:本文章只是我学习的一个记录,有关引用的地方,我都会给出链接的。如果侵犯作者权益,请通知我及时删除。
看了一下,Linux一站式学习的函数调用
,搞的我热血沸腾,立马找你一下这方面的资料看看。终于看到了一个有关Linux堆栈溢出的文章,就拿来试试手了。参考
我的学习linux笔记(一)堆栈
下面来贴一下我的代码吧。基本和上篇文章一样的。
#include<stdio.h>
void attack()
{
int attack=1;
printf("hi,attacked!\n");
}
void yaya()
{
int yaya=1;
printf("hi,yaya is my wife\n");
}
void foo()
{
int c_foo=1;
*(& c_foo +2)=(int)attack;
}
void main(){
int a_main=1;
i=(int)yaya;
foo();
}
BTW,说明一下,我的平台是redhat 9,2.4的核。
直接上图吧:
先来看一下各个函数的反汇编:
main函数的:
yaya函数的:
attack函数的:
foo函数的哦:
好了,下面一一细说了:
函数main:
*(& a_main -1)=(int)yaya;这条语句非常关键,因为
(& a_main -1)地址换成了yaya函数的入口地址,那么
(& a_main -1)原来的是什么呢?
请看图:
我们知道,GCC指针都是4字节对齐的,那么
(& a_main -1)就是地址0xbfffe2d0,里面什么也没有。只是GCC为了16字节对齐原则而空着的。具体可见:X86汇编语言学习手记
顺便说一下,
在执行程序时,操作系统为进程分配一块栈空间来保存函数栈帧,在每个函数的栈帧中,ebp
指向栈底,而esp
指向栈顶,在x86平台上这个栈是从高地址向低地址增长的,我们知道每次调用一个函数都要分配一个栈帧来保存参数和局部变量。(
Linux一站式学习的函数调用
)
下面执行foo函数。
foo函数
:
关键在*(& c_foo
+2)=(int)attack;
它的意思就是
本
来0xbfffe2cc存放的是main返回的地址0x0804839f,但是改为attack函数的入口地址0x08048328。
这样就会导致main函数返回时,跑到attack函数继续执行。
好了,foo函数执行完了,ESP依次出栈,就到了
attack函数的入口地址0x08048328。
就attack函数执行完毕以后,此时的ESP就为
地址0xbfffe2d0,回想一下,这
地址0xbfffe2d0里面是什么?
对了,就是yaya函数的入口地址。
那么接下来,就是执行yaya函数了。
那么yaya函数执行完以后,接下来,该怎么办么?
由于main函数丢失了返回地址,导致main函数无法返回
相关文档:
一:前言
最近在研究android的sensor driver,主要是E-compass,其中用到了Linux input子系统.在网上也看了很多这方面的资料,感觉还是这篇分析的比较细致透彻,因此转载一下以便自己学习,同时和大家分享!
(这篇博客主要是以键盘驱动为例的,不过讲解的是Linux Input Subsystem,可以仔细的研究一下!)
键盘驱动将检 ......
Parsing command line arguments:
Parameter "silent" = true
java.lang.ArrayIndexOutOfBoundsException: 2
at oracle.net.ca.CmdlineArgs.parseArgs(Unknown Source)
at oracle.net.ca.I ......
http://www.zhetao.com/content.dep?m=news&id=1235137892661247
发布日期 2009-2-20 21:51:32
Linux
系统的
SNMP
服务设置
1)
安装
SNMP
略,请参阅
LINUX
系统
SNMP
安装说明,一般情况下
Linux
中的均已经自动安装了
SNMP
服务。以下命令可以检测
SNMP
服务是否安装以及安装的文件包。
[ ......
1、 如何在Linux系统下添加一个帐户:用户名为std02,密码为pwd02?
:#useradd std02
#passwd std02
出现提示输入口令pwd02,再次按提示输入pwd02
也可以:
#useradd -n std02 -p pwd02
2、 新建一个子目录/home/public,让它被所有的用户共享,而且拥有所有权限,但不能被非属主删除?
:#mkdir /home/public
#chm ......
进入linux源代码目录,会看到若干子目录和文件。现代操作系统一般由进程管理,内存管理,文件系统,驱动程序和网络协议栈组成。
arch : 包含了所有和体系结构相关的核心代码。它下面的每个子目录代表一种linux支持的体系结构。如arm目录就是与ARM体系结构兼容的CPU的子目录;/arch/i386则是intel CPU及其兼容 ......