对一处汇编指令 jmpq 的结果不理解
我动态加载了一段代码到内存里执行,报 SIGSEGV。用 gdb 调试,发现一个奇怪的现象:
首先,环境是:
(gdb) bt
#0 0x00007ffff7e91360 in ?? ()
(gdb) i r
...
rip 0x7ffff7e91360
cs 0x33
(gdb) x/i 0x7ffff7e91360
=> 0x7ffff7e91360: rex.W jmpq *0x5e019(%rip) # 0x7ffff7eef380
(gdb) x/7xb 0x7ffff7e91360
0x7ffff7e91360: 0x48 0xff 8x25 0x19 0xe0 0x05 0x00
(gdb) x/5i 0x7ffff7eef380
0x7ffff7eef380: mov %gs,(%rax)
0x7ffff7eef382: or (%rax),%al
0x7ffff7eef384: add %al,(%rax)
0x7ffff7eef386: add %al,(%rax)
0x7ffff7eef388: subb $0xa,(%rax)
(gdb) x/8xb 0x7ffff7eef380
0x7ffff7eef380: 0x8c 0x28 0x0a 0x00 0x00 0x00 0x00 0x00
gdb 给的提示 0x7ffff7eef380
这里的信息也很奇怪。
单步调试:
(gdb) stepi
0x00000000000a288c in ?? ()
该处地址未映射,无法访问,报段错误。
请问这个问题可能是什么原因?谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
重新观察了一下
0x7ffff7eef380
处的信息,不正好是0x00000000000a288c
么,那么jmpq *偏移量(寄存器)
的意思也就明确了,找到【寄存器的值 + 4 Bytes 偏移量】这处地址开始的 8 Bytes 的值,跳转到该值指向的地址处。