计算进程内环境的内存地址

时间:2014-03-12 21:24:15

标签: linux process memory-address memory-layout address-space

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

#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. 的argc
  4. 主要
  5. 的返回地址
  6. framepointer
  7. 主要
  8. 中的局部变量
  9. ...等...
  10. 常量和全局数据没有存储在堆栈中,这就是为什么我也不明白为什么VULN常量的长度会影响shellcode放置的地址。

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

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

0 个答案:

没有答案