我有两个系统:
我在两个系统上编译了以下代码:
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”数组。
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。
[问]为什么会这样?
感谢。
答案 0 :(得分:7)
你的缓冲区不是NUL'\ 0'终止,所以你打印的是超过缓冲区本身的字符。
我建议尝试添加nops [numOfNops - 1] ='\ 0';在调用printf之前。
答案 1 :(得分:4)
考虑告诉printf()
究竟要打印多少个NOP:
printf("GET /%.*s%s\x90\x90%s HTTP/1.0 \n", numOfNops, nops, buf, ESPs);
这可以避免您没有空终止字符串的问题。
(请注意,%.*s
表示法严格告诉printf()
格式化最多numOfNops
个字符,或直到第一个空字节为止,作为转换规范的输出。问题中的NOP值的实数数组,这与告诉printf()
准确打印给定数量的NOP值相同。)