【发布时间】:2013-01-18 11:26:42
【问题描述】:
在下面的简单程序中,命令指向堆上的 400 个字节。然后我将“./search '”复制到命令,*buffer 指向“'”(单引号)之后的下一个字节。启动缓冲区指向的内存,我使用 memset 将 300 个字节设置为值 0x41(ASCII 'A'),然后附加结束单引号。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
int main(int argc, char *argv[]) {
char *command = (char *)malloc(400);
bzero(command, 400);
strcpy(command, "./search \'");
char *buffer = command + strlen(command);
memset(buffer, 0x41, 300);
strcat(command, "\'");
system(command);
free(command);
}
但是当我在 gdb 中查看 *command 和 *buffer 时,我看到的就是这个。
char * command 0x601010 "./search '", 'A' <repeats 186 times>...
char * buffer 0x60101e 'A' <repeats 200 times>...
首先我希望它说重复 299 次,其次我希望命令和缓冲区重复具有相似的值。有人可以告诉我我错过了什么吗?
【问题讨论】:
-
command被释放后是否查看其字节? -
这些转义引号 (
"\'") 在我看来很奇怪... -
memset(buffer, 'A', 300);会更具可读性... :)
-
对我来说似乎是一个 GDB 显示错误:P