【问题标题】:Converting a hexadecimal number to hexadecimal escaped character array将十六进制数转换为十六进制转义字符数组
【发布时间】:2018-04-08 12:28:40
【问题描述】:

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

  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);

【问题讨论】:

  • 如果您无法回答问题,请不要对答案投反对票。否决票很容易,但给出答案却很难。

标签: c escaping string-formatting shellcode


【解决方案1】:

我不知道有这个内置函数,但你可以自己做:

#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 然后以另一种方式发布作为答案。
  • 发布了答案。看看吧!
【解决方案2】:

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

【讨论】: