我在玩 gdb,奇怪的事情正在发生。我想在内存中找到字符串“/bin/sh”所在的某个地址,gdb 说它找到了。但是当我检查那里的内存时,那里的字符串完全不同。
你能帮我找出这种行为的含义吗,我怎样才能真正找到字符串的地址?
(gdb) find 0xb7ecffb0,+999999, "/bin/sh"
0xb7fba23f
1 pattern found.
(gdb) x/s 0xb7fba23f
0xb7fba23f: "KIND in __gen_tempname\""
我在玩 gdb,奇怪的事情正在发生。我想在内存中找到字符串“/bin/sh”所在的某个地址,gdb 说它找到了。但是当我检查那里的内存时,那里的字符串完全不同。
你能帮我找出这种行为的含义吗,我怎样才能真正找到字符串的地址?
(gdb) find 0xb7ecffb0,+999999, "/bin/sh"
0xb7fba23f
1 pattern found.
(gdb) x/s 0xb7fba23f
0xb7fba23f: "KIND in __gen_tempname\""
GDB 大部分时间都找不到真正的字符串。但是,您可以从本地目标文件中找到字符串的偏移量,并使用动态加载信息对其进行调整。
来自info proc map:
Mapped address spaces:
Start Addr End Addr Size Offset objfile
0x8048000 0x8049000 0x1000 0 /opt/protostar/bin/stack6
0x8049000 0x804a000 0x1000 0 /opt/protostar/bin/stack6
0x804a000 0x806b000 0x21000 0 [heap]
0xb7e96000 0xb7e97000 0x1000 0
0xb7e97000 0xb7fd5000 0x13e000 0 /lib/libc-2.11.2.so
0xb7fd5000 0xb7fd6000 0x1000 0x13e000 /lib/libc-2.11.2.so
0xb7fd6000 0xb7fd8000 0x2000 0x13e000 /lib/libc-2.11.2.so
0xb7fd8000 0xb7fd9000 0x1000 0x140000 /lib/libc-2.11.2.so
...
并从/lib/libc-2.11.2.so文件:
user@protostar:/opt/protostar/bin$ xxd -u /lib/libc-2.11.2.so |grep -B 1 bin/sh
011f3b0: 6600 696E 6974 7900 6E61 6E00 2D63 002F f.inity.nan.-c./
011f3c0: 6269 6E2F 7368 0065 7869 7420 3000 6361 bin/sh.exit 0.ca
使用此信息/bin/sh在虚拟地址空间中查找字符串的静态地址:
(gdb) x/s 0xb7e97000+0x011f3bf
0xb7fb63bf: "/bin/sh"
我知道这不是您关于为什么 GDB find 在查找字符串时会显示此行为的第一个问题的答案。我找不到任何关于那件事的信息。我使用了Protostar Stack6 Challenge binary和exploit-exercises-protostar-2.iso环境,所以地址一定要一样。/bin/csh同一个共享对象文件中也有字符串。您可以尝试使用此方法查找该地址。