我目前正在使用'The Art of Exploitation'中的环境变量来学习基于堆栈的缓冲区溢出利用。本章的重点是将环境变量用于shellcode,而无需创建NOP底座。这需要我将要使用的变量的确切地址。这是片段:
使用
execl()
,将使用现有环境,但是如果使用execle()
,可以指定整个环境。如果环境数组只是作为第一个字符串的shellcode(带有NULL
指针以终止列表),唯一的环境变量将是Shellcode。这使其地址易于计算。在Linux中,地址将为**0xbffffffa**
,减去shellcode在环境,减去已执行程序名称的长度。
关键是我使用的是完全不同的系统版本(带有4.19内核的Kali Linux 64位),在我的情况下,作者(0xbffffffa)
使用的基址非常不同,我不知道在哪里寻找它。有什么方法可以找到该文件,还是应该在文档中查找?
我假设这个地址在堆栈的底部。还是堆栈基础的确切地址?
好,所以我去了gdb并开始查看$ rsp以下的地址(具有较高的值),直到得到这个为止:
0x7fffffffeffc: ""
0x7fffffffeffd: ""
0x7fffffffeffe: ""
0x7fffffffefff: ""
0x7ffffffff000: <error: Cannot access memory at address 0x7ffffffff000>
这就是我想知道的全部。不过谢谢您的时间。
我想,如果仅找到该环境变量的特定地址,则可以使用getenv()
函数。
% export PAYLOAD=$<whatever_payload>
示例:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
printf("env address at %p\n", argv[1], getenv(argv[1]));
return (0);
}
用法:
% ./getenv PAYLOAD
看起来像32位内核下没有堆栈ASLR的32位进程的32位地址。 main
得到3个args:argc,argv和envp,最后一个是指向env[]
数组above RSP的指针。当然,它不会接近RSP,但要低于RSP,它将因函数调用的堆栈增长而被踩踏。
[在进程入口点(_start
),x86-64系统V ABI指定初始RSP指向argc
,高于它的是argv[0]
,argv[1]
,...。然后是[ C0]数组(再次终止为NULL)。
在x86-64 System V ABI中有记录。
除非禁用堆栈ASLR,否则RSP的初始值是固定的。