2014-10-27 63 views
1

我和我的合作伙伴正在尝试在C语言中使用return-to-libc漏洞,我们不得不处理的一个步骤是将字符串格式的地址解析为little endian。将字符串地址解析成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”会导致它有一个小小的怪异。我确信有一个简单的方法可以做到这一点,但我和我的伙伴正在挣扎。

有没有简单的方法来解析这样的地址到Little Endian?

+0

的sprintf()或的snprintf()的手册是你的朋友。 – wildplasser 2014-10-27 23:23:28

+0

你想要“\ xa2 \ xb4 \ xff \ xff”或“a2b4ffff”吗?如果它是字符串格式的地址,为什么使用\ x将以下十六进制值转换为单个字符?字符串“\ x41 \ x62”定义了一个字符串“Ab”。另外,你假定“ffff”不需要交换,但是在(比如说)“ffee”的情况下,它会。 – 2014-10-27 23:33:50

+0

阅读手册页本身就是一项技能。我会花一些时间处理snprintf(),看看我找到了什么。 – OneManRiot 2014-10-28 00:07:00

回答

2

只要阅读它作为一个足够长度的十六进制数,或使用指针正确的格式:

  1. strtoll

    long long n = strtoll(yourstringhere, 0, 16); 
    void* p = (void*)n; 
    
  2. sscanf

    void* p; 
    sscanf(yourstringhere, "%p", &p); 
    
  3. 或嵌入十六进制文字:

    0xffffb4a2 
    
+0

这并没有解决交换Endian格式的要求 – 2014-10-27 23:37:27

+0

@WeatherVane:我猜他们的目标是小端,在这种情况下我们完成了。 – Deduplicator 2014-10-27 23:38:56

+0

OP已经明确显示了他的输入和输出字符串表示方式相反。 – 2014-10-27 23:41:40