Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将字符串地址解析为小尾端_C_String Parsing_Libc_Endianness - Fatal编程技术网

C 将字符串地址解析为小尾端

C 将字符串地址解析为小尾端,c,string-parsing,libc,endianness,C,String Parsing,Libc,Endianness,我和我的搭档正在尝试使用C语言返回libc漏洞,我们必须处理的一个步骤是解析以字符串格式提供给little endian的地址 例如,我们以字符串形式给出一个地址,如下所示: "ffffb4a2" 最终需要看起来像: "\xa2\xb4\xff\xff" 因此,我们可以将其反馈到我们的程序中,以便在余下的开发中使用。巧妙地使用memcpy,如: memcpy(subbuff1, &address[6], 2); subbuff1[2] = '\0'; memcpy(subbuff2,

我和我的搭档正在尝试使用C语言返回libc漏洞,我们必须处理的一个步骤是解析以字符串格式提供给little endian的地址

例如,我们以字符串形式给出一个地址,如下所示:

"ffffb4a2"
最终需要看起来像:

"\xa2\xb4\xff\xff"
因此,我们可以将其反馈到我们的程序中,以便在余下的开发中使用。巧妙地使用memcpy,如:

memcpy(subbuff1, &address[6], 2);
subbuff1[2] = '\0';
memcpy(subbuff2, &address[4], 2);
subbuff2[2] = '\0';
.....strcat(subbuff1, subbuff2);
还有一些合适的空终止符,我们可以得到如下结果:

"a2b4ffff"
我们的节目一点都不喜欢。在我们尝试过的任何类型的容量中使用“\x”都会导致它出现轻微的异常。我相信有一个简单的方法可以做到这一点,但我和我的搭档正在努力


有没有一种简单的方法可以将这样一个地址解析成小的Endian?

只需将其作为足够长度的十六进制数读取,或者使用适当的指针格式:

  • 或嵌入十六进制文字:

    0xffffb4a2
    

  • sprintf()或snprintf()手册是您的朋友。您想要“\xa2\xb4\xff\xff”还是“a2b4ffff”?如果是字符串格式的地址,为什么要使用\x将以下十六进制值转换为单个字符?字符串“\x41\x62”定义了一个字符串“Ab”。此外,您假设“ffff”不需要交换,但在(比如)“ffee”的情况下,它会交换。阅读手册页本身就是一项技能。我将花一些时间处理snprintf(),看看我发现了什么。这并没有满足交换Endian的要求format@WeatherVane:我猜他们的目标是little endian,在这种情况下,我们就完成了。OP已经明确地将其输入和输出字符串表示法反向显示。@WeatherVane:“
    ffffffb4a2
    ”那是他们打印的字符串。解析为一个数字,即
    0xffffb4a2
    。现在,如果他们的目标是little endian,那么这4个八位字节将像
    a2 b4 ff ff
    那样存储。小恩迪安,这…可能就是我要找的。我不完全确定,因为正如重复数据消除者所说,它似乎不是小endian。我们现在正在玩这个。
    void* p;
    sscanf(yourstringhere, "%p", &p);
    
    0xffffb4a2