我有两个系统:
- 3.13.0-35-通用…x86_64 x86_64 x86_64 GNU/Linux与gcc:4.8.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"数组。
- 当我在64位系统#1上运行它时,输出看起来正是我想要的样子
- 当我在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数值相同。)