簡體   English   中英

在C錯誤中編譯ShellCode程序

[英]Compiling ShellCode Program in C error

我目前正在閱讀一本有關shellcoding的書,在其中一個示例中遇到了一些問題。 我正在嘗試編譯下面的代碼,但始終收到關於流浪“ \\”的錯誤。 是否由於“ \\”而必須輸入某些字符?

// shellcode.c

char shellcode[] =
“\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46”
“\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1”
“\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68”;

int main(){

    int *ret;
    ret = (int *)&ret + 2;
    (*ret) = (int)shellcode;
}

\\ x表示十六進制字符轉義。 從C99 6.4.4.4 .:

在十六進制轉義序列中,反斜杠后面的十六進制數字和字母x被視為構成整數字符常量的單個字符或構成寬字符常量的單個寬字符的一部分。

示例3即使對於具有char類型的對象使用了八位,構造'\\ x123'也會指定僅包含一個字符的整數字符常量,因為十六進制轉義序列僅以非十六進制字符結尾。 要指定包含兩個值為'\\ x12'和'3'的字符的整數字符常量,可以使用結構'\\ 0223',因為八進制轉義序列在三個八進制數字后終止。 (此兩個字符的整數字符常量的值是實現定義的。)

我認為問題是由印刷引號引起的:

在C語言中,字符串必須以普通雙引號括起來: "

十六進制字符的\\x表示法僅在字符串(雙引號)和字符常量(單個qoutes)內部起作用。 由於存在印刷字體,編譯器無法將代碼識別為字符串。

因此,嘗試像這樣更改聲明:

char shellcode[] =
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";

如前所述,您的報價在這里是一個問題。 將它們粘貼到vi上會生成?~@~\\\\xeb..這可能解釋了有關反斜杠的抱怨。

另外,我會考慮對shellcode進行強制轉換,這更簡單。

char shellcode[] =
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";

int main(){
        (*(void(*)()) shellcode)();
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM