如何在Linux中查找环境变量的地址

问题描述 投票:0回答:3

我目前正在使用'The Art of Exploitation'中的环境变量来学习基于堆栈的缓冲区溢出利用。本章的重点是将环境变量用于shellcode,而无需创建NOP底座。这需要我将要使用的变量的确切地址。这是片段:

使用execl(),将使用现有环境,但是如果使用execle(),可以指定整个环境。如果环境数组只是作为第一个字符串的shellcode(带有NULL指针以终止列表),唯一的环境变量将是Shellcode。这使其地址易于计算。在Linux中,地址将为**0xbffffffa**,减去shellcode在环境,减去已执行程序名称的长度。

关键是我使用的是完全不同的系统版本(带有4.19内核的Kali Linux 64位),在我的情况下,作者(0xbffffffa)使用的基址非常不同,我不知道在哪里寻找它。有什么方法可以找到该文件,还是应该在文档中查找?

我假设这个地址在堆栈的底部。还是堆栈基础的确切地址?

linux environment-variables buffer-overflow exploit shellcode
3个回答
0
投票

好,所以我去了gdb并开始查看$ rsp以下的地址(具有较高的值),直到得到这个为止:

0x7fffffffeffc: ""
0x7fffffffeffd: ""
0x7fffffffeffe: ""
0x7fffffffefff: ""
0x7ffffffff000: <error: Cannot access memory at address 0x7ffffffff000>

这就是我想知道的全部。不过谢谢您的时间。


0
投票

我想,如果仅找到该环境变量的特定地址,则可以使用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

0
投票

看起来像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的初始值是固定的。

© www.soinside.com 2019 - 2024. All rights reserved.