2014-10-27 17 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