我试图在xxd转储中找到一行代码。如果我用gdb打开可执行文件并在代码行中添加一个断点,它会显示一个类似0x8212224的地址,但我的xxd转储只会高达0x3040080。
有没有办法将gdb地址转换成转储中的地址?还是有更好的方法让我在xxd转储中获得地址?
发布于 2015-09-15 02:11:21
我试图在xxd转储中找到一行代码。
干什么用?For what?你到底想达到什么目的?
很有可能,使用GDB可以更容易地实现这一点。
如果我用gdb打开可执行文件并在代码行中添加一个断点,它会显示一个类似0x8212224的地址,但我的xxd转储只会高达0x3040080。
您需要更多地了解您的可执行文件。
运行以下命令:readelf -l your_exe。这将显示您的可执行文件中有多个LOAD段,并将告诉您这些段在哪个偏移处开始于文件中,这些段在哪个虚拟地址中显示在内存中,它们有多大,以及它们应该具有什么样的保护。
例如:
$ readelf -l a.out
Elf file type is EXEC (Executable file)
Entry point 0x80482f0
There are 9 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4
INTERP 0x000154 0x08048154 0x08048154 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x0056c 0x0056c R E 0x1000
LOAD 0x000f08 0x08049f08 0x08049f08 0x00114 0x00118 RW 0x1000
DYNAMIC 0x000f14 0x08049f14 0x08049f14 0x000e8 0x000e8 RW 0x4
NOTE 0x000168 0x08048168 0x08048168 0x00044 0x00044 R 0x4
GNU_EH_FRAME 0x000490 0x08048490 0x08048490 0x0002c 0x0002c R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10
GNU_RELRO 0x000f08 0x08049f08 0x08049f08 0x000f8 0x000f8 R 0x1这告诉您,程序可执行文本(第一个LOAD段)出现在地址0x08048000的内存中,并出现在偏移量0的文件中。也就是说,xxd将在偏移量0x124处显示到文件中的指令将出现在内存中的地址0x08048124。
假设您的可执行文件也链接到0x08048000的默认地址加载,则0x8212224在内存中的指令将出现在xxd输出中的偏移量0x1ca224处。
https://stackoverflow.com/questions/32571207
复制相似问题