在x86_64和i686上编译时,NOP字符0x90的c-printf不同



我有两个系统:

  1. 3.13.0-35-通用…x86_64 x86_64 x86_64 GNU/Linux与gcc:4.8.2
  2. 2.6.32-21-generic#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%sx90x90%s HTTP/1.0 n", nops, buf, ESPs);

问题是打印"nops"数组。

  1. 当我在64位系统#1上运行它时,输出看起来正是我想要的样子
  2. 当我在32位系统#2上运行它时,printf()输出的NOP部分包含额外的奇怪字符,即:

Hexdump系统#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|

Hexdump系统#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。

[Q] 为什么?

谢谢。

您的缓冲区不是NUL'\0'终止的,所以您打印的字符超过了缓冲区本身。

我建议尝试添加nops[numOfNops-1]='\0';在调用printf之前。

考虑告诉printf()准确打印多少NOP:

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

这样就避免了您没有用null终止字符串的问题。

(请注意,严格地说,%.*s表示法告诉printf()将格式设置为最多numOfNops个字符,或直到第一个空字节,作为转换规范的输出。如果您有问题中的NOP值的实心数组,这与告诉printf()打印给定数量的NOP数值相同。)

相关内容

  • 没有找到相关文章

最新更新