2015-04-12 60 views
1

我使用這個代碼從這裏:Read and Execute Shellcode from a .txt File導演的Shellcode輸出到文件 - ç

#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-堆棧保護-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 
+0

這應該在shellcode寫入標準輸出而不是標準錯誤時起作用。試試:./testshell> output.txt 1>&2 – Deanie

+0

'fscanf'格式'「\\ x%02x」'是多餘的和誤導性的。它應該是''\\ x%2x' – chqrlie

+0

@Deanie在1&2沒有骰子,輸出仍然發生在終端,而不是output.txt – user2059300

回答

3

轉移註釋到一個答案,在信貸到期時給予信貸。

Deanie說:

如果shellcode的被寫入標準輸出和標準錯誤不是這應該工作。嘗試:

./testshell > output.txt 1>&2 

爲了這user2059300的OP,迴應道:

1>&2沒有骰子,輸出仍然出現在終端,而不是在output.txt的

David C. Rankin說:

我認爲他的意思是./testshell > output.txt 2>&1將stdout & 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通常是文件描述符1和2的一個副本,因此您可以寫入0(標準輸入)並從1和2(標準輸出和標準錯誤)讀取。當然,這樣做是完全不支持和不可移植的(並且不能通過文件流stdin,stdout,stderr)來完成,但通常shell程序代碼是不可移植的。

這似乎是關鍵。 David C. Rankin確認:

哈!你釘了它。 ./testshell > output.txt 0>&1工作得很好。學習已經發生......謝謝。這是第一次,希望是最後一次,我會跑過去。我太老了,無法學習這些技巧。

,所以沒有user2059300

謝謝你們這麼多。學習確實發生了。 ./testshell > output.txt 0>&1

很顯然,我不知道這將是解決方案,但在標準輸出和標準錯誤的I/O重定向失敗了,它成爲了可能。這種行爲有很長的歷史(第7版Unix,也許在此之前),儘管很少有明確記錄。