将Shellcode输出定向到文件 - C

时间:2015-04-12 19:16:06

标签: c file shellcode

我在这里使用此代码:Read and Execute Shellcode from a .txt File

#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <stdlib.h>

int main(void)
{
    FILE *file = fopen("text.txt", "r");
    unsigned char *buf;
    int length = 0;
    struct stat st;
    int v;

    // get file size and allocate. We're going to convert to bytes 
    // from text, so this allocation will be safely large enough
    fstat(fileno(file), &st);
    buf = valloc(st.st_size);
    while (fscanf(file, "\\x%02x", &v) == 1)
    {
        buf[length++] = v;
    }

    fclose(file);

    mprotect(buf, length, PROT_EXEC);

    int (*ret)() = (int (*)())buf;
    ret();

    return 0;
}

我正在编译: gcc -fno-stack-protector -z execstack testshell.c -o testshell

它运行得很好,但它执行的shellcode写入终端,但我想以某种方式将其重定向到文件。

我试过了:

./testshell > output.txt

但似乎无法捕获shellcode的结果。

如何捕获运行的任何shellcode的输出,如果可能,将其重定向到文件?

更新:我正在使用的shellcode,它输出一个sys_write系统调用输出到文件描述符(它进行计算并打印到屏幕上) -

\xeb\x4d\x5e\x66\x83\xec\x0c\x48\x89\xe0\x48\x31\xc9\x68\x33\x09\x00\x7c\x48\x89\xcf\x80\xc1\x0c\x40\x8a\x3e\x40\xf6\xd7\x40\x88\x38\x48\xff\xc6\x68\x16\x96\xd0\xd9\x48\xff\xc0\xe2\xea\x2c\x0c\x48\x89\xc6\x68\xf2\xf5\x44\x48\x48\x31\xc0\x48\x89\xc7\x04\x01\x48\x89\xc2\x80\xc2\x0b\x0f\x05\x48\x31\xc0\x04\x3c\x0f\x05\xe8\xae\xff\xff\xff\x85\xa7\xaa\xc7\x9e\x87\xa5\xa5\x8e\xb7\x87\xba\x31\x80\xe0\x55\xef\xa1\x93\x0c\x4e\x1c\xdc\x34\x53\xb3\x8b\x43\x48\x68\x30\x1d\x4b\x65\x5b\x52\x41\x4e\x44\x53\x54\x52\x32\x5d

1 个答案:

答案 0 :(得分:3)

将评论转移到答案中,在信用到期时给予信用。

Deanie说:

  

如果shellcode写入stdout而不是stderr,这应该有效。尝试:

./testshell > output.txt 1>&2

OP向user2059300回复:

  

1>&2上没有骰子,输出仍然出现在终端中,而不是在output.txt中

David C. Rankin说:

  

我认为他的意思是./testshell > output.txt 2>&1重定向stdout&amp; stderr到output.txt。

user2059300声明:

  

还是不行,......我提供了我测试的shellcode。

然后我问:

  • shell代码如何写作?它在做什么?我不打算为你剖析它; shell代码往往是特定于平台的,并且您还没有确定您正在使用哪个系统。当然,很容易猜到你在英特尔机器上使用Linux,但它可能是32位或64位Linux,以及需要了解shell代码知道如何重定向它的输出。例如,如果它打开终端并写入终端,您将很难避免输出出现在终端上。

user2059300声明:

  

它是文件描述符的sys_write系统调用输出。

提示我问:

  • 哪个文件描述符? 0,1,2或其他?

David C. Rankin注意到:

  

那仍然悬而未决。转储到程序集会显示对fprintf的调用,但重定向stderrstdout不会执行任何操作。它几乎就像使用内核printf一样。

我反驳道:

  • 这就是我将0列为候选文件描述符的原因。 文件描述符0通常是文件描述符1和2的副本,因此您可以写入0(标准输入)并从1和2读取(标准输出和标准错误)。当然,正在执行因此完全不受支持且不可移植(并且您无法通过文件流stdinstdoutstderr执行此操作,但是一般来说shell代码是非便携式的。

这似乎是关键。 David C. Rankin确认:

  

哈!你钉了它。 ./testshell > output.txt 0>&1工作得很好。学习已经发生了......谢谢。这是第一次,希望是最后一次,我会遇到这种情况。我太老了,不能学习这些技巧。

以及user2059300

  

非常感谢你们。学习确实发生了。 ./testshell > output.txt 0>&1

显然,我不知道这将成为解决方案,但是当标准输出和标准错误的I / O重定向失败时,它就成了可能。这种行为有很长的历史(第7版Unix,可能在此之前),尽管很少有明确记录。