0

この小さな単純なプログラムを C で作成しました。そのコードを投稿します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]){

char *char_ptr;
int *int_ptr;
int mem_size;

if (argc<2) {
mem_size = 50;
}
else
{
mem_size = atoi(argv[1]);
}

printf("\t[+] allocating %d bytes of memory on the heap for char_ptr\n", mem_size);
char_ptr = (char *) malloc(mem_size);
if(char_ptr == NULL) {
fprintf(stderr, "Error: could not allocate heap memory.\n");
exit(-1);
}
strcpy(char_ptr, "This memory is in the heap segment");
printf("char_ptr (%p) -> '%s'\n", char_ptr, char_ptr);

printf("\t[+] allocating 12 bytes of memory on the heap for int_ptr\n");
int_ptr = (int *)malloc(12);

if(int_ptr == NULL){
fprintf(stderr, "Error: could not allocate heap memory.\n");
exit(-1);
}

*int_ptr = 31337;

printf("int_ptr (%p) --> %d\n", int_ptr, *int_ptr);
printf("\t[-] freeing char_ptr's heap memory...\n");
free(char_ptr);

printf("\t[+] allocating another 17 bytes for char_ptr\n");
char_ptr = (char *) malloc(17);

if(char_ptr == NULL){
fprintf(stderr, "Error: could not allocate heap memory.\n");
exit(-1);
}

strcpy(char_ptr, "New Memory");
printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr);
printf("\t[-] freeing int_ptr's heap memory.\n");
free(int_ptr);
printf("\t[-] freeing char_ptr's memory\n");
free(char_ptr);
printf("Program exiting\n");
return 0;
}

29 以上のパラメーターで実行すると問題ありませんが、28 以下を配置するとセグメンテーション違反になります... ヒープとスタックの間のアドレスの問題について考えていたのですが、問題はfree() int_ptr 呼び出し。誰でも私を助けることができますか?これじゃ意味がわからない…

どうもありがとうございました 良い一日を

4

1 に答える 1

0

char_ptr メモリ ( "This memory is in the heap segment") にコピーする最初の文字列は、終端の NUL バイトを含めて 35 バイトの長さです。これにより、35 未満のすべてのパラメーターのヒープが破損します。

無料はおそらく上書きされたデータに依存しないため、偶然にも29まで機能します。

于 2013-03-26T22:05:44.640 に答える