2014-09-20 63 views
0

我有2個系統:printf的時候在x86_64和i686的編制有所不同

  1. 3.13.0-35泛型... x86_64的x86_64的x86_64的GNU/Linux的用gcc:4.8.2
  2. 2.6.32-21-通用#32 Ubuntu的... i686的GNU/Linux的用gcc:4.4.3

我編這兩個系統上下面的代碼:

int numOfNops = 600; 
unsigned char nops[numOfNops]; 
int i; 
for (i=0; i < numOfNops; i++) { 
    nops[i] = '\x90'; 
} 
... 
printf("GET /%s%s\x90\x90%s HTTP/1.0 \n", nops, buf, ESPs); 

問題是「nops」數組的打印。

  1. 當我在64位系統#1上運行它時,輸出看起來和我想要的一樣。
  2. 當我在32位系統#2運行它,的printf的NOP部分()輸出包含附加怪異字符,即:

進制打印系統#1

00000250 90 90 90 90 90 90 90 90 90 90 90 90 90 89 e3 da |................| 
00000260 c4 d9 73 f4 5f 57 59 49 49 49 49 49 49 49 49 49 |..s._WYIIIIIIIII| 

進制打印系統#2:

00000250 90 90 90 90 90 90 90 90 90 90 90 90 90 24 c5 12 |.............$..| 
00000260 89 e3 da c4 d9 73 f4 5f 57 59 49 49 49 49 49 49 |.....s._WYIIIIII| 

所以附加字符是:0x24 0xc5 0x12。

[問]爲什麼呢?

謝謝。

+0

爲什麼...你這樣做? – 2014-09-20 18:02:36

+0

只是一項任務。 :) – no6 2014-09-20 18:06:42

+0

什麼是「NOP字符」? HTTP 1.0中的URI必須是ASCII,而0x90不是有效的ASCII字符。 – Wyzard 2014-09-20 18:35:29

回答

4

考慮告訴printf() 到底有多少NOP指令打印:

printf("GET /%.*s%s\x90\x90%s HTTP/1.0 \n", numOfNops, nops, buf, ESPs); 

這避免了,你沒有空終止字符串的問題。

(需要注意的是嚴格的%.*s符號告訴printf()高達格式化爲numOfNops字符,或直到第一個空字節,作爲輸出的轉換規範的。如果你有NOP值的固體陣列中的問題,這與告知printf()準確打印給定數量的NOP值相同。)

7

您的緩衝區不是NUL'\ 0'終止,所以您打印的字符超過了緩衝區本身。

我建議嘗試添加nops [numOfNops - 1] ='\ 0';在調用printf之前。

+1

nops [numOfNops] = 0更喜歡。另外,過去的緩衝區,沒有通過。一口井,緩衝區需要更大。 – Deduplicator 2014-09-20 18:04:04

+0

這會導致一個緩衝區溢出。感謝修正拼寫。 – superjedi 2014-09-20 18:18:19

+0

邏輯錯誤是首選? (緩衝區溢出會導致不正確地解決邏輯錯誤,這也是一個bug) – Deduplicator 2014-09-20 18:18:49

相關問題