KDOC 226: 任意のアドレスに読み書きする

この文書のステータス

  • 作成
    • 2024-08-24 貴島
  • レビュー
    • 2024-09-09 貴島

概要

メモリアドレスを直接指定して、値を読み書きしてみるコードを見る。

0x2b67 アドレスに値 111 を書き込み、後からアドレス直接指定で値を読み込むようなアセンブリが生成できている。

無効な範囲を指定すると、Segmentation Faultになり書き込みできない。

int main() {
  *((int *) 0x0001) = (int) 111;
}
int main() {
  int x = 1;
  printf("0x%08X: x -> %i\n", &x, x);
  *((int *) &x) = (int) 999999;
  printf("0x%08X: x -> %i\n", &x, x);
}
0x4423DD04: x -> 1
0x4423DD04: x -> 999999

セグメント内なら、任意のメモリにアクセスできる。

int main() {
  int x = 2;
  printf("0x%08X: x -> %i\n", &x, x);
  int load1 = *((int *) &x-0x100000);
  int load2 = *((int *) &x+0x100);
  int load3 = *((int *) &x+0x2);
  printf("load1(-0x100000): 0x%08X\n", load1);
  printf("load2(+0x100): 0x%08X\n", load2);
  printf("load3(+0x2): 0x%08X\n", load3);
}
0x9EBD7178: x -> 2
load1(-0x100000): 0x00000000
load2(+0x100): 0x00001000
load3(+0x2): 0x00001000
int main() {
  char base = 0;
  char a = 'a';
  char b = 'b';
  char c = 'c';

  printf("0x%08X: base\n", &base);
  printf("0x%08X: a\n", &a);
  printf("0x%08X: b\n", &b);
  printf("0x%08X: c\n", &c);
  printf("\n");
  printf("a: 0x%08X\n", *((char *) &base+0x1));
  printf("b: 0x%08X\n", *((char *) &base+0x2));
  printf("c: 0x%08X\n", *((char *) &base+0x3));
}
0x5FD01F44: base
0x5FD01F45: a
0x5FD01F46: b
0x5FD01F47: c

a: 0x00000061
b: 0x00000062
c: 0x00000063

関連

Backlinks