CONTENTS, ALLOC, LOAD, DATA
17 .dtors 0000000c0804950408049504000005042**2
CONTENTS, ALLOC, LOAD, DATA
[warning3@redhat-6 dtor]$ objdump -s -j .dtors yopta
yopta: file format elf32-i386
Contents of section .dtors:
8049504 ffffffff 48840408 00000000 ....H.......
我们可以看到就象前面所说的那样,stop()的地址(0x08048448)被储存在.dtors
中。0xffffffff是.dtors的头标记,0x00000000是.dtors的尾标记。
既然我们的目的是对程序本身进行攻击,因此从现在开始就让我们完全忘掉
.ctors,因为我们不能用它做任何有用的事。(溢出总是发生在main()开始后)
让我们试一个正常的程序,它没有使用这些函数属性标记。
[warning3@redhat-6 dtor]$ cat > bleh.c
#include
#include
static void bleh(void);
int
main(int argc, char *argv[])
{
static u_char buf[] = "bleh";
if (argc
14 .data 00000014080494dc080494dc000004dc2**2
CONTENTS, ALLOC, LOAD, DATA
15 .eh_frame 00000004080494f0080494f0000004f02**2
CONTENTS, ALLOC, LOAD, DATA
16 .ctors 00000008080494f4080494f4000004f42**2
CONTENTS, ALLOC, LOAD, DATA
17 .dtors 00000008080494fc080494fc000004fc2**2
CONTENTS, ALLOC, LOAD, DATA
我们看到即使没有任何函数被标记为析构属性,.dtors仍然会出现。现在我们
来看一下它的内容:
[warning3@redhat-6 dtor]$ objdump -s -j .dtorsbleh
bleh: file format elf32-i386
Contents of section .dtors:
80494fc ffffffff 00000000 ........
我们看到程序的.dtors中没有指定任何析构函数的地址。
可能我们将buf声明为静态的而且将其初始化看起来有些奇怪。我们这么做
只是为了将其储存在.data区,它非常靠近.dtors节。[ 译者注:参看前面
objdump -h bleh的结果,.data在.dtors更低的内存区 ]
这不是我们将数据写入.dtors的唯一方法,你可以使用任何方法来完成,例如
格式串攻击,通过返回libc来直接使用strcpy(),利用malloc块分配错误等等。
这里采用这种做法只是为了简化起见。
现在我们的目的是要执行bleh()函数中的代码,正常情况下这是不可能发生的。
但我们可以通过在.dtors中增加一个指向bleh()的函数入口来达到目的。我们必
须覆盖0x0000000(地址在0x080494fc)。缓冲区溢出攻击
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-27331-2.html
期待