有没有办法使用特定的 C function/symbol 作为 nm 的输出
Is there a way to use a particular C function/symbol as output by nm
我正在尝试分析已编译的文件以供网络安全学习之用,并希望使用特定功能。
这是 nm --defined-only ./compiled_file
的输出:
0000000000200d98 d _DYNAMIC
0000000000200f88 d _GLOBAL_OFFSET_TABLE_
0000000000000ba0 R _IO_stdin_used
0000000000000d64 r __FRAME_END__
0000000000000bfc r __GNU_EH_FRAME_HDR
0000000000201010 D __TMC_END__
0000000000201010 B __bss_start
0000000000201000 D __data_start
00000000000007d0 t __do_global_dtors_aux
0000000000200d90 t __do_global_dtors_aux_fini_array_entry
0000000000201008 D __dso_handle
0000000000200d88 t __frame_dummy_init_array_entry
0000000000200d90 t __init_array_end
0000000000200d88 t __init_array_start
0000000000000b90 T __libc_csu_fini
0000000000000b20 T __libc_csu_init
0000000000201010 D _edata
0000000000201018 B _end
0000000000000b94 T _fini
0000000000000660 T _init
0000000000000710 T _start
0000000000201010 b completed.7696
0000000000201000 W data_start
0000000000000740 t deregister_tm_clones
0000000000000810 t frame_dummy
0000000000000a92 T main
000000000000081a T function_I_would_like_to_use \ << this one
0000000000000780 t register_tm_clones
我主要用Python(我对C/C++知之甚少,只是基础),所以,自然而然地,我一直在尝试在[=中弄乱这个文件53=] 使用 ctypes 库,用文件创建一个 CDLL 对象,但据我所见,上述函数名称中的 none 出现在对象或其属性的 dir() 中。
我从类似这样的东西开始:https://book.pythontips.com/en/latest/python_c_extension.html#ctypes 然后在 dir()/__dict__
的兔子洞里越走越深,试图找到我认识的东西,但运气不好。
如您所见,我正在尝试对这个 ELF 进行逆向工程,但对机器代码没有任何真正的了解,但希望我能在这个过程中学到一些东西哈哈!出于练习的目的,我也宁愿在没有外部(第三方)库的情况下进行此操作。
file ./compiled_file
的输出是:
./compiled_file: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=cf62f3afa6f99f98a863d44932d2e
0f9f8594e71, not stripped
所以,我的主要问题是,如上所述,有没有办法在 [=53] 中调用 nm
、objdump
等列出的 'defined' 函数之一=] 或其他?我读到 BuildID[sha1] 可用于调试。我需要这个吗?
我希望这个问题不要太宽泛。本质上,我主要是在寻找是或否,也许在正确的方向上有点点头,关于我是否可以用上面的信息调用该函数!
编辑:
感谢第一个非常快速的回答和评论,我一直在用 C 语言 dlopen/dlsym
搞乱。脚本如下(改编自 here):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
int main(int argc, char** argv) {
void *handle;
void (*func_in_question)(const char*);
handle = dlopen("./compiled_file", RTLD_LAZY);
if (!handle) {
/* fail to load the library */
fprintf(stderr, "Error: %s\n", dlerror());
return EXIT_FAILURE;
}
*(void**)(&func_in_question) = dlsym(handle, "function_I_would_like_to_use");
if (!func_in_question) {
/* no such symbol */
fprintf(stderr, "Error: %s\n", dlerror());
dlclose(handle);
return EXIT_FAILURE;
}
func_in_question(argv[1]);
dlclose(handle);
return EXIT_SUCCESS;
}
似乎按预期工作,除此之外 returns:
Error: ./compiled_file: undefined symbol: function_I_would_like_to_use
(同样的错误,事实上,导致我问这个问题¯\_(ツ)_/¯)
然而,最初的问题已经得到解答。
是的,这是可能的。毕竟,在共享库中导出符号的目的是能够使用它们。在 C 中,您可以通过将库链接到应用程序(对于 python 不是真正的选项)或运行时加载库并找到所需的符号(在 linux 上:dlopen, dlsym).联机帮助页示例显示了如何在 C 中执行此操作。
我正在尝试分析已编译的文件以供网络安全学习之用,并希望使用特定功能。
这是 nm --defined-only ./compiled_file
的输出:
0000000000200d98 d _DYNAMIC
0000000000200f88 d _GLOBAL_OFFSET_TABLE_
0000000000000ba0 R _IO_stdin_used
0000000000000d64 r __FRAME_END__
0000000000000bfc r __GNU_EH_FRAME_HDR
0000000000201010 D __TMC_END__
0000000000201010 B __bss_start
0000000000201000 D __data_start
00000000000007d0 t __do_global_dtors_aux
0000000000200d90 t __do_global_dtors_aux_fini_array_entry
0000000000201008 D __dso_handle
0000000000200d88 t __frame_dummy_init_array_entry
0000000000200d90 t __init_array_end
0000000000200d88 t __init_array_start
0000000000000b90 T __libc_csu_fini
0000000000000b20 T __libc_csu_init
0000000000201010 D _edata
0000000000201018 B _end
0000000000000b94 T _fini
0000000000000660 T _init
0000000000000710 T _start
0000000000201010 b completed.7696
0000000000201000 W data_start
0000000000000740 t deregister_tm_clones
0000000000000810 t frame_dummy
0000000000000a92 T main
000000000000081a T function_I_would_like_to_use \ << this one
0000000000000780 t register_tm_clones
我主要用Python(我对C/C++知之甚少,只是基础),所以,自然而然地,我一直在尝试在[=中弄乱这个文件53=] 使用 ctypes 库,用文件创建一个 CDLL 对象,但据我所见,上述函数名称中的 none 出现在对象或其属性的 dir() 中。
我从类似这样的东西开始:https://book.pythontips.com/en/latest/python_c_extension.html#ctypes 然后在 dir()/__dict__
的兔子洞里越走越深,试图找到我认识的东西,但运气不好。
如您所见,我正在尝试对这个 ELF 进行逆向工程,但对机器代码没有任何真正的了解,但希望我能在这个过程中学到一些东西哈哈!出于练习的目的,我也宁愿在没有外部(第三方)库的情况下进行此操作。
file ./compiled_file
的输出是:
./compiled_file: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=cf62f3afa6f99f98a863d44932d2e
0f9f8594e71, not stripped
所以,我的主要问题是,如上所述,有没有办法在 [=53] 中调用 nm
、objdump
等列出的 'defined' 函数之一=] 或其他?我读到 BuildID[sha1] 可用于调试。我需要这个吗?
我希望这个问题不要太宽泛。本质上,我主要是在寻找是或否,也许在正确的方向上有点点头,关于我是否可以用上面的信息调用该函数!
编辑:
感谢第一个非常快速的回答和评论,我一直在用 C 语言 dlopen/dlsym
搞乱。脚本如下(改编自 here):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
int main(int argc, char** argv) {
void *handle;
void (*func_in_question)(const char*);
handle = dlopen("./compiled_file", RTLD_LAZY);
if (!handle) {
/* fail to load the library */
fprintf(stderr, "Error: %s\n", dlerror());
return EXIT_FAILURE;
}
*(void**)(&func_in_question) = dlsym(handle, "function_I_would_like_to_use");
if (!func_in_question) {
/* no such symbol */
fprintf(stderr, "Error: %s\n", dlerror());
dlclose(handle);
return EXIT_FAILURE;
}
func_in_question(argv[1]);
dlclose(handle);
return EXIT_SUCCESS;
}
似乎按预期工作,除此之外 returns:
Error: ./compiled_file: undefined symbol: function_I_would_like_to_use
(同样的错误,事实上,导致我问这个问题¯\_(ツ)_/¯)
然而,最初的问题已经得到解答。
是的,这是可能的。毕竟,在共享库中导出符号的目的是能够使用它们。在 C 中,您可以通过将库链接到应用程序(对于 python 不是真正的选项)或运行时加载库并找到所需的符号(在 linux 上:dlopen, dlsym).联机帮助页示例显示了如何在 C 中执行此操作。