2014-09-20 31 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

相关问题