linux - 从 _start 以外的函数调用 dlsym 崩溃
问题描述
我有这个工作正常的汇编程序:
SECTION .text
EXTERN dlopen ; loads a dynamic library
EXTERN dlsym ; retrieves the address for a symbol in the dynamic library
global _start ; "global" means that the symbol can be accessed in other modules. In order to refer to a global symbol from another module, you must use the "extern" keyboard
_start:
; load the library
mov rdi, str_libX11so
mov rsi, 2; RTLD_NOW=2
call dlopen wrt ..plt
; PLT stands for Procedure Linkage Table:
; used to call external library functions whose address is not know at link time,
; so it must be resolved by the dynamic linker at run time
; more info: https://reverseengineering.stackexchange.com/questions/1992/what-is-plt-got
mov [ptr_libX11so], rax ; the previous function call returned the value in rax
; load the function
mov rdi, [ptr_libX11so]
mov rsi, fstr_XOpenDisplay
call dlsym wrt ..plt
mov [fptr_XOpenDisplay], rax
mov rax, 60 ; syscal: exit
mov rdi, 0 ; return code
syscall
str_libX11so: db "libX11.so", 0
; X11 function names
fstr_XOpenDisplay: db "XOpenDisplay", 0
SECTION .data
ptr_libX11so: dq 0 ; ptr to the X11 library
; X11 function ptrs
fptr_XOpenDisplay: dq 0
然后我尝试将调用的代码移动dlsym
到函数(loadX11Functions
)中。
SECTION .text
EXTERN dlopen ; loads a dynamic library
EXTERN dlsym ; retrieves the address for a symbol in the dynamic library
loadX11Functions:
mov rdi, [ptr_libX11so]
mov rsi, fstr_XOpenDisplay
call dlsym wrt ..plt
mov [fptr_XOpenDisplay], rax
ret
global _start ; "global" means that the symbol can be accessed in other modules. In order to refer to a global symbol from another module, you must use the "extern" keyboard
_start:
; load the library
mov rdi, str_libX11so
mov rsi, 2; RTLD_NOW=2
call dlopen wrt ..plt
; PLT stands for Procedure Linkage Table:
; used to call external library functions whose address is not know at link time,
; so it must be resolved by the dynamic linker at run time
; more info: https://reverseengineering.stackexchange.com/questions/1992/what-is-plt-got
mov [ptr_libX11so], rax ; the previous function call returned the value in rax
call loadX11Functions
mov rax, 60 ; syscal: exit
mov rdi, 0 ; return code
syscall
str_libX11so: db "libX11.so", 0
; X11 function names
fstr_XOpenDisplay: db "XOpenDisplay", 0
SECTION .data
ptr_libX11so: dq 0 ; ptr to the X11 library
; X11 function ptrs
fptr_XOpenDisplay: dq 0
我很困惑,这么小的变化会破坏我的程序。
这是我用于编译的命令:
nasm -f elf64 -g -F dwarf minimal.asm && gcc -nostartfiles -no-pie minimal.o -ldl -o minimal && ./minimal
解决方案
推荐阅读
- asp.net-core - TestHost 生成无效的 URI:无法确定 URI 的格式
- elasticsearch - 为什么文件没有被删除?deleteByQuery 成功但不删除任何内容
- gradle - java.lang.NoSuchFieldError: gradle artifactoryPublish 任务期间的 INSTANCE 错误
- javascript - “addEventListener”在幕后是如何工作的?
- drupal - Drupal 7:如何发送 HTML 电子邮件
- android-studio - 为什么我的 Android Layout Design 在我的智能手机上无法正常工作
- video-intelligence-api - Google Cloud Video Intelligence API 中的本地文件是否有视频大小限制?
- java - 在 java 8 可选过滤器中抛出异常是一种不好的做法
- javascript - 如何在 Selenium 的特定页面上禁用 javascript?
- python - TensorFlow 数据集重塑图像