akkietech’s diary

セキュリティ関連メインの自分用メモ書き。twitter: @akkietech

1/7 ポインタ復習とperlで引数渡す

■ポインタ復習

ハイジャッキングの本で、ポインタ(int *aみたいな)が出てきて

ちょっと分からんなったからキリン本で復習

 

void main() {

int *p;    #ポインタ宣言、アドレスを格納する

int a = 10;

p = &a;    # &aがアドレスを指す、pのポインタにaのアドレスを代入する

printf("a_value is %d\n", a);    # 10

printf("a_address is %p\n", &a);    # 変数aのアドレス

printf("p_value is %d\n", *p);    # ポインタに格納されたアドレスが参照する値=>10

printf("p_address is %p\n", p);    # ポインタに格納されたアドレス

printf("\n\n");

}

 

配列はちょっとややこしい

配列の変数は、変数名自体がアドレスを指しているので

&は必要ないんだとか

文字列(char)も同じ考え方

 

void main() {

int *p_array;    # 配列のアドレスを格納するポインタを宣言

int a_array[] = {1,2,3,4,5};

p_array = a_array;    # ポインタに配列a_arrayのアドレスを格納、a_arrayに「&」は不要

printf("a_array address is %p\n", a_array);    # 配列の先頭アドレス

printf("a_array[0] is %d\n", a_array[0]);    # 配列の先頭の値

printf("p_array[0] is %d\n", *p_array+1); # ポインタが格納するアドレスが指す配列の2つ目の値

printf("p_array address is %p\n", p_array+1);    # ポインタが格納するアドレスが指す配列の2つ目の値のアドレス

}

 

いやー難しい

 

■CとかGDBperl使って引数渡す時

 

C:

# ./a.out $(perl -e 'print "A"x32;')

 

gdb:

(gdb) run $(perl -e 'print "A"x32;')