3

Linuxで32ビットx86にコンパイルされたCコードを実行しています。そして、私はいくつかのメモリにアクセスしようとしています。どうやら私はスタックに書き込みたり.bss.dataスタックに書き込んだりすることができます。少し前までは、.ctorsセグメントと.dtorsセグメントは書き込み可能でしたが、なくなったようです。

試行錯誤せずに、セグメントがメモリ内のどのセクションにマップされているかをどのように見つけることができますか?どのアドレスが書き込み可能メモリにマップされ、どのアドレスが実行可能であるかを確認するにはどうすればよいですか?

4

2 に答える 2

5

試行錯誤せずに、セグメントがメモリ内のどのセクションにマップされているかをどのように見つけることができますか?

実行可能ファイルについて話すとき、セクションとセグメントには特定の意味がELFあり、上記の使用法はその意味と一致しません。

ELFセクションはロード時に重要ではなく、(ロード可能な)セグメントのみが重要です。

このreadelf -l a.outコマンドは、ELFセクションからセグメントへのマッピングを正確に提供します。例えば

readelf -l /bin/date

Elf file type is EXEC (Executable file)
Entry point 0x8048c60
There are 6 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x000c0 0x000c0 R E 0x4
  INTERP         0x0000f4 0x080480f4 0x080480f4 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x05fe0 0x05fe0 R E 0x1000
  LOAD           0x006000 0x0804e000 0x0804e000 0x00208 0x00334 RW  0x1000
  DYNAMIC        0x006078 0x0804e078 0x0804e078 0x000c8 0x000c8 RW  0x4
  NOTE           0x000108 0x08048108 0x08048108 0x00020 0x00020 R   0x4

 Section to Segment mapping:
  Segment Sections...
   00
   01     .interp
   02     .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata
   03     .data .eh_frame .dynamic .ctors .dtors .jcr .got .bss
   04     .dynamic
   05     .note.ABI-tag

これは.ctors、書き込み可能なセグメント3にマップされていることを示しています(この出力は古代のUnitedLinux 1.0分布からのものです)。

現在は、.ctorsとは別のセグメントに入れられ、.data特別なセグメントを介した再配置後の書き込みから保護されていGNU_RELROます。

于 2012-06-11T02:45:43.927 に答える
3

見てください/proc/$pid/maps(またはpmapユーティリティを使用してください)。これまでにメモリ領域について知りたかった以上のことがわかります。

于 2012-06-10T22:57:36.810 に答える