0

以下の単純なプログラムでは、コマンドはヒープ上の 400 バイトを指しています。次に、"./search '" をコマンドにコピーします。*buffer は、" ' " (シングル クォーテーション) の後の次のバイトを指します。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 回の繰り返しを期待していました。次に、コマンドとバッファの両方の繰り返しが同様の値であると予想していました。誰かが私に何が欠けているか教えてもらえますか?

4

2 に答える 2

4

GDB マニュアルのセクション 10.8 印刷設定から:

印刷要素の要素数を設定します

配列 gdb が出力する要素の数に制限を設定します。gdb が大きな配列を出力している場合、set print elements コマンドで設定された要素数を出力した後、出力を停止します。この制限は、文字列の表示にも適用されます。gdb の開始時に、この制限は 200 に設定されます。number-of-elements を 0 に設定すると、印刷が無制限になります。

于 2013-02-03T18:01:23.220 に答える
0

仮定の確認:

#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, "\'");
    int last = -1;
    int n = 0;
    for (int i = 0; i < 400; i++) {
        if (n && command[i] != last) {
            printf("%d %d x %02x '%c'\n", i - n, n, last, last);
            n = 1;
        } else {
            n++;
        }
        last = command[i];
    }
    printf("%d %d x %d '%c'\n", 400 - n, n, last, last);
    return 0;
}

次の出力が生成されます。

0 1 x 2e '.'
1 1 x 2f '/'
2 1 x 73 's'
3 1 x 65 'e'
4 1 x 61 'a'
5 1 x 72 'r'
6 1 x 63 'c'
7 1 x 68 'h'
8 1 x 20 ' '
9 1 x 27 '''
10 300 x 41 'A'
310 1 x 27 '''
311 89 x 0 ''

これは正しく見え、質問の診断と一致しません。したがって、gdb が壊れているか、解放された後のバイトを見ています。

于 2013-02-03T17:59:31.763 に答える