2014-02-19 118 views
4

我想了解如何創建shellcode,並且需要輸入一大堆十六進制代碼。但是,當我給我的程序輸入十六進制代碼時,十六進制代碼被視爲正常的ASCII字符,而反斜槓只是簡單地被刪除。將輸入視爲十六進制值

實施例:

./a.out 「AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \ X35 \ X85 \ X04 \ X08」

在這種情況下,十六進制碼(\ X35 \ X85 \ X04 \ X08)被視爲單個字符 - 即X = 0x75等

我的程序處理輸入的方式是類似於以下:

int authentication(char *pass){ 
    char password_buffer[16]; 
    strcpy(password_buffer, pass); 
    return 1; 
} 

int main(int argc, char *argv[]){ 
    if(authentication(argv[1])){ 
     //access 
    } 
    return 1; 
} 

從存儲器的strcpy()後轉儲:

0xbffff260: 0x41414141 0x41414141 0x41414141 0x41414141 
0xbffff270: 0x78353378 0x30783538 0x38307834 0x08048400 

正如可以看到,在地址0xbffff270存儲器值是0x78353378,其對應於x35x因而在十六進制代碼輸入三個第一字母。我想這四個字節是0x08048535。

如何格式化我的輸入以做到這一點?

回答

1

你可以使用shell printf功能是這樣的:

./a.out "$(printf "AAAAA\x08\x32\x20\xfa\x10\x16")" 

的十六進制值將被轉換爲 「二進制」。


這部分也許只增加混亂,而我,可能將其刪除:

否則,你也可以做一個快速的轉換你的程序中,以使其更易於跨平臺和系統使用。粗樣本。 (這需要一個串並轉換,他們都爲\xNN任何十六進制序列,並且除了在完成打印成十六進制):

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

/* 
* Hex Dump 
* */ 
static void txt(unsigned char *buf, int len) 
{ 
     int i; 
     fprintf(stdout, " "); 
     for (i = 0; i < len; ++i) { 
       fprintf(stdout, 
         "%c", 
         isprint(buf[i]) ? 
         buf[i] : 
         '.' 
       ); 
     } 
} 

static void xxd(unsigned char *buf, int len) 
{ 
     int i, j; 

     for (i = 0; i < len;) { 
       if (!(i % 16)) { 
         fprintf(stdout, 
           "%s%03x: ", 
           i ? "\n" : "", 
           i 
         ); 
       } 
       fprintf(stdout, "%02x ", buf[i]); 
       if (!(++i % 16)) 
         txt(&buf[i - 16], 16); 
     } 
     if ((i % 16)) { 
       for (j = i; j % 16; ++j) 
         fprintf(stdout, " "); 
       txt(&buf[i - (i % 16)], i % 16); 
     } 
     fprintf(stdout, "\n"); 
} 

/* 
* Hex char to value. 
* */ 
static unsigned hexval(char c) 
{ 
    if (c >= '0' && c <= '9') 
     return c - '0'; 
    if (c >= 'a' && c <= 'f') 
     return c - 'a' + 10; 
    if (c >= 'A' && c <= 'F') 
     return c - 'A' + 10; 
    return ~0; 
} 
/* 
* Convert all hex sequences. 
* */ 
int str2bin(char *data, unsigned char **buf_ptr) 
{ 
     int len, converted = 0; 
     unsigned int val; 
     unsigned char *buf; 

     buf = malloc(strlen(data) + 1); 
     *buf_ptr = buf; 

     for (; *data;) { 
       /* If next char is not backslash copy it and continue */ 
       if (*data != '\\') { 
         *buf++ = *data++; 
         continue; 
       } 
       /* If we have anything else then x or X after, return error. */ 
       if (data[1] != 'x' && data[1] != 'X') 
         return -1; 
       val = (hexval(data[2]) << 4) | hexval(data[3]); 
       /* If not valid hex, return error. */ 
       if (val & ~0xff) 
         return -1; 
       *buf++ = val; 
       data += 4; 
       /* Keep track of converted numbers, "for fun". */ 
       ++converted; 
     } 
     len = buf - *buf_ptr; 

     fprintf(stderr, "%d hex values converted.\n", converted); 

     return len; 
} 

int main(int argc, char *argv[]) 
{ 
     int len; 
     unsigned char *buf = NULL; 
     if (argc < 2) { 
       fprintf(stderr, "Missing argument.\n"); 
       return 1; 
     } 

     if ((len = str2bin(argv[1], &buf)) < 0) { 
       fprintf(stderr, "Bad input.\n"); 
       return 2; 
     } 

     xxd(buf, len); 

     free(buf); 

    return 0; 
} 

給你這樣的事情:

$ ./hexin "Hello\x20\x44\x65\x08\x01\x00\x00\xf7\xdf\x00\x02Bye" 
11 hex values converted. 
000: 48 65 6c 6c 6f 20 44 65 08 01 00 00 f7 df 00 02 Hello De........ 
010: 42 79 65           Bye 
1

\x表示法只適用於代碼本身中的字符串文字,而不是用戶鍵入的內容。如果你想要字符\ x04,那麼直接在字符串中輸入♦。

+0

抱歉,我不太明白你的答案。什麼是「♦」? – user1090614

+0

這是Windows爲字符4顯示的內容(即在數字鍵盤上鍵入Alt和4)。如果您使用* nix來獲得^ D類型,則會更困難。 – tabstop

+0

好吧,所以你基本上說我必須輸入相應的十六進制值的鍵盤命令?如果在我的情況下,我想輸入「\ x08」,即ASCII中的「backspace」 - 這怎麼可能? – user1090614

相關問題