如何将字符缓冲区中的十六进制地址转换为写入内存
How to convert a hex address from a char buffer to be written to memory
所以我在这里得到了这个函数,它是从主函数调用的:
void overflow(char *arg)
{
char buf[1369];
strcpy (buf, arg);
printf ("Thank you for contacting customer service. You are so important to us that we wrote a program to serve you.\n");
printf ("Please hold for %u minutes while I drop your call\n", (int)strlen(buf));
return;
}
字符串*arg
来自argv[1]
。
当我做类似的事情时:
./overflow1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa29390408
堆栈看起来像这样:
0xffffce80: 0x07 0x00 0x00 0x61 0x61 0x61 0x61 0x61
0xffffce88: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffce90: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffce98: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffcea0: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffcea8: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffceb0: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffceb8: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffcec0: 0x61 0x61 0x32 0x39 0x33 0x39 0x30 0x34
0xffffcec8: 0x30 0x38
那么我如何获得:
0x32 0x39 0x33 0x39 0x30 0x34 0x30 0x38
成为:
29 39 04 08
?
我知道这需要从实际的十六进制值转换为字母数字值,例如 08
,但是网络上的每个字符串工具都没有给我任何结果,因为 08
不是ascii/alphanumeric 值。
如果您想将任意字节作为参数发送到命令,则必须在 shell 中对它们进行转义。例如,在 bash 中,您可以这样做:
echo $'a\x09b\x33c'
它会显示:
a b3c
因为 bash 将 $'' 构造中的 \xHH(两个十六进制数字)解释为单字节十六进制值。 0x09 是制表符,0x33 是数字 3.
所以我在这里得到了这个函数,它是从主函数调用的:
void overflow(char *arg)
{
char buf[1369];
strcpy (buf, arg);
printf ("Thank you for contacting customer service. You are so important to us that we wrote a program to serve you.\n");
printf ("Please hold for %u minutes while I drop your call\n", (int)strlen(buf));
return;
}
字符串*arg
来自argv[1]
。
当我做类似的事情时:
./overflow1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa29390408
堆栈看起来像这样:
0xffffce80: 0x07 0x00 0x00 0x61 0x61 0x61 0x61 0x61
0xffffce88: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffce90: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffce98: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffcea0: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffcea8: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffceb0: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffceb8: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61
0xffffcec0: 0x61 0x61 0x32 0x39 0x33 0x39 0x30 0x34
0xffffcec8: 0x30 0x38
那么我如何获得:
0x32 0x39 0x33 0x39 0x30 0x34 0x30 0x38
成为:
29 39 04 08
?
我知道这需要从实际的十六进制值转换为字母数字值,例如 08
,但是网络上的每个字符串工具都没有给我任何结果,因为 08
不是ascii/alphanumeric 值。
如果您想将任意字节作为参数发送到命令,则必须在 shell 中对它们进行转义。例如,在 bash 中,您可以这样做:
echo $'a\x09b\x33c'
它会显示:
a b3c
因为 bash 将 $'' 构造中的 \xHH(两个十六进制数字)解释为单字节十六进制值。 0x09 是制表符,0x33 是数字 3.