Преобразование шестнадцатеричного числа в шестнадцатеричный массив экранированных символов

avatar
Dibsyhex
8 апреля 2018 в 12:28
149
2
1

Я пытаюсь создать шелл-код, в котором я хочу, чтобы пользователь передал целочисленное значение в качестве порта, которое приходит в качестве аргумента, а затем поместил это значение шелл-кода вместе с фактическим шелл-кодом. Чтобы выполнить 1-й шаг, я написал этот код.

  1. Преобразовать аргумент в число с помощью atoi()
  2. Преобразование числа в хост и сетевой порядок байтов с помощью htons()

    unsigned short int port = htons(atoi(argv[1]));

    Поэтому, если я передам ./a.out 9000, переменная порта сохранит значение 2823 (которое является шестнадцатеричным значением 9000)

  3. Моя следующая цель — сохранить 2823 в массиве символов, как в прямом порядке байтов, чтобы массив символов хранил значение в шестнадцатеричном экранированном формате, подобно этому

    unsigned char port[]="\x23\x28"

Итак, как мне преобразовать шестнадцатеричное число в порту в шестнадцатеричную экранированную строку и сохранить ее в массив char[] без жесткого кодирования?

Я видел множество примеров печати в формате "\x23\x28", но я не видел ни одного примера сохранения в этом формате. Я уже пытался использовать sscanf, как показано ниже, но не смог добиться того, чего хотел.

sscanf(port_shellcode,"\\x",port);

Источник
Dibsyhex
8 апреля 2018 в 13:40
0

Пожалуйста, не понижайте ответ, если вы не можете ответить на вопрос. Проголосовать против легко, но дать ответ сложно.

Ответы (2)

avatar
Dibsyhex
8 апреля 2018 в 16:05
0

Хорошо, проблема решена :) Я попытался сделать это по-другому, я изменил опкоды шеллкода напрямую вместо того, чтобы сделать это в моем описанном подходе. Я разделил число на AA и BB и сохранил их в переменных char, а затем перезаписал местоположение этими значениями. Подробности можно найти в моей кодовой базе github. https://github.com/dibsy/SLAEx86/blob/master/assignment1/shellcode_with_configurable_port.c

avatar
mnistic
8 апреля 2018 в 13:44
0

Я не знаю встроенной функции для этого, но вы можете сделать это самостоятельно:

#define CONVERT_TO_ESCAPED_HEX(n, s) \
    do { \
        char ts[100] = { '\0' }; \
        int i; \
        for (i = 0; i < sizeof(n) / sizeof(char); i++) \
        { \
            sprintf(s, "\\x%02x%s", ((n >> (8 * i)) & 0xff), ts); \
            sprintf(ts, "%s", s); \
        } \
    } while(0)
...
short port = 9000;
char s[100];
CONVERT_TO_ESCAPED_HEX(port, s);
printf("%s\n", s);
Dibsyhex
8 апреля 2018 в 14:41
0

Спасибо, но я нашел более простой способ сделать это! Ваше здоровье

mnistic
8 апреля 2018 в 14:48
2

@Dibsyhex Тогда опубликуйте это другим способом в качестве ответа.

Dibsyhex
8 апреля 2018 в 16:27
0

Разместил ответ. Посмотри !