2014-02-19 4 views
4

Я пытаюсь узнать, как создать шеллкод, и мне нужно ввести целую кучу шестнадцатеричных кодов. Тем не менее, когда я предоставляю моей программе вход с шестнадцатеричными кодами, шестнадцатеричные коды обрабатываются как обычные символы ASCII, а обратная косая черта просто просто лишена.Обработать ввод как шестнадцатеричные значения

Пример:

./a.out "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \ x35 \ x85 \ x04 \ x08"

В этом случае шестигранные коды (\ x35 \ x85 \ x04 \ x08) рассматривается как отдельные символы - то есть х = 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; 
} 

дамп из памяти после зЬгсра():

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

Как можно видеть, по адресу 0xbffff270 значение памяти является 0x78353378, что соответствует x35x и, таким образом, три первых букв в вводе гекса-коде. Я бы хотел, чтобы эти четыре байта были 0x08048535.

Как я могу отформатировать свой ввод, чтобы сделать это?

ответ

1

Вы можете использовать оболочку printf функции, как это:

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

значения Hex будут преобразованы в «двоичный».


Эта часть может быть, только добавляя беспорядок, и я могу и, возможно, удалить его:

Иначе вы могли бы также сделать быструю конвертацию внутри вашей программы, чтобы сделать его проще в использовании на разных платформах и системах. Грубый образец. (Это принимает строку и преобразует любые шестнадцатеричные последовательности, где они представлены в виде \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», который является «backspace» в ASCII - как это возможно? – user1090614

Смежные вопросы