将十六进制数转换为十六进制转义字符数组

时间:2018-04-08 12:28:40

标签: c escaping string-formatting shellcode

我正在尝试创建一个shellcode,我希望用户将一个整数值作为一个参数作为端口传递,然后将此shellcode值与实际的shellcode一起放入。为了实现第一步,我编写了这段代码。

  1. 使用atoi()
  2. 将参数转换为数字
  3. 使用htons()

    将数字转换为主机和网络字节顺序

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

    因此,如果我传递./a.out 9000,则端口变量存储值2823(十六进制值为9000)

  4. 我的下一个目标是将2823存储到字符数组中,就像在小端字节中一样,以便字符数组以十六进制转义格式存储该值,如下所示

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

  5. 那么如何将端口中的十六进制数转换为十六进制转义字符串并将其存储到char []数组中而不进行硬编码?

    我见过很多关于将它打印成“\ x23 \ x28”格式的例子,但我还没有看到任何关于如何以该格式存储的例子。我已经尝试过使用类似下面的sscanf,但却无法实现我想要的确切内容。

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

好的问题解决了:)我尝试以不同的方式做到这一点,我直接更改了shellcode的操作码,而不是在我描述的方法中这样做。我将数字拆分为AA和BB并将它们存储在char变量中,然后用这些值覆盖该位置。详细信息可以在我的github代码库中找到 https://github.com/dibsy/SLAEx86/blob/master/assignment1/shellcode_with_configurable_port.c

相关问题