欢迎来到【mscomm控件使用源码】【escape 源码】【evm源码】rtld源码-皮皮网网站!!!

皮皮网

【mscomm控件使用源码】【escape 源码】【evm源码】rtld源码-皮皮网 扫描左侧二维码访问本站手机端

【mscomm控件使用源码】【escape 源码】【evm源码】rtld源码

2024-12-24 09:46:06 来源:{typename type="name"/} 分类:{typename type="name"/}

1.android dlopen原型在哪个so
2.exit()分析与利用

rtld源码

android dlopen原型在哪个so

       1、 .so态库

       ä½¿ç”¨gcc或者g++编译器态库文件(处g++编译器例)

       g++ -shared -fPIC -c XXX.cpp

       g++ -shared -fPIC -o XXX.so XXX.o

       2、 .so态库态调用接口函数说明

       æ€åº“调用关系需要调用态库程序编译通g++-L-l命令指定例:程序test启需要加载目录/root/src/liblibtest_so1.so态库编译命令照编写执行:

       g++ -g -o test test.cpp –L/root/src/lib –ltest_so1

       ï¼ˆå¤„我重点讲解态库态调用关于静态通g++编译命令调用式作详细讲解具体相关内容网查询)

       Linux提供专门组API用于完打态库查找符号处理错关闭态库等功能

       é¢äº›æŽ¥å£å‡½æ•°é€ä»‹ç»ï¼ˆè°ƒç”¨äº›æŽ¥å£éœ€å¼•ç”¨æ–‡ä»¶#include ):

       1) dlopen

       å‡½æ•°åŽŸåž‹ï¼švoid *dlopen(const char *libname,源码int flag);

       åŠŸèƒ½æè¿°ï¼šdlopen必须dlerrordlsymdlclose前调用表示要库装载内存准备使用要装载库依赖于其库必须首先装载依赖库dlopen操作失败返NULL值;库已经装载则dlopen返同句柄

       å‚æ•°libname般库全路径dlopen直接装载该文件;指定库名称dlopen按照面机制搜寻:

       a.根据环境变量LD_LIBRARY_PATH查找

       b.根据/etc/ld.so.cache查找

       c.查找依/lib/usr/lib目录查找

       flag参数表示处理未定义函数式使用RTLD_LAZY或RTLD_NOWRTLD_LAZY表示暂处理未定义函数先库装载内存等用没定义函数再说;RTLD_NOW表示马检查否存未定义函数若存则dlopen失败告终

       2) dlerror

       å‡½æ•°åŽŸåž‹ï¼šchar *dlerror(void);

       åŠŸèƒ½æè¿°ï¼šdlerror获近dlopen,dlsym或dlclose操作错误信息返NULL表示错误dlerror返错误信息同清除错误信息

       3) dlsym

       å‡½æ•°åŽŸåž‹ï¼švoid *dlsym(void *handle,const char *symbol);

       åŠŸèƒ½æè¿°ï¼šdlopen库装载内存dlsym获指定函数(symbol)内存位置(指针)找指定函数则dlsym返NULL值判断函数否存使用dlerror函数

       4) dlclose

       å‡½æ•°åŽŸåž‹ï¼šint dlclose(void *);

       åŠŸèƒ½æè¿°ï¼šå·²ç»è£…载库句柄减句柄减至零则该库卸载存析构函数则dlclose析构函数调用

       3、 普通函数调用

       å¤„源码实例说明各源码文件关系:

       test_so1.htest_so1.cpptest_so1.so态库

       test_so2.htest_so2.cpptest_so2.so态库

       test_dl.cpptest_dl执行程序test_dl通dlopen系列等API函数并使用函数指针达态调用同so库test函数目

       -

exit()分析与利用

       main()函数结束时,需要执行一些清理工作,源码因此内核层面的源码终止通过`exit`系统调用完成,这实际上是源码调用一个syscall,由libc实现。源码然而,源码mscomm控件使用源码直接调用`_exit()`可能导致stdout缓冲区的源码数据被内核立即释放,无法刷新,源码信息丢失。源码因此,源码调用`_exit()`前,源码需要在用户层面完成一些清理工作。源码libc中定义了`exit()`函数,源码其主要作用是源码进行用户层面的资源清理,最后调用`_exit()`进行系统级别的源码escape 源码清理。

       在pwn技术中,`_exit()`无法被利用,而`exit()`则提供了多种攻击点。因此,本文将深入分析libc中`exit()`函数的实现、相关机制以及利用方法。

       分析`exit()`源码,evm源码了解libc是如何组织清理函数,并通过`run_exit_handlers()`函数处理这些清理函数。分析`__exit_funcs`链表,探讨是否有可能通过劫持该链表来实现特定函数的调用。进一步研究`__exit_funcs`是如何添加清理函数的,以及其中包含哪些函数。理解程序启动过程,打拱源码包括ELF的入口点`_start()`和动态链接器ld.so.2的作用,以及`libc_start_main()`函数如何在`exit_funcs`中添加函数,并调用构造函数。

       通过深入分析,了解`libc_start_main()`会在`exit_funcs`中放入`__libc_atexit`和构造函数。详细分析这三个关键要素,并讨论ELF的vivo源码`fini()`和`init()`函数的作用。理解`ld.so.2`中的`rtdl_fini()`函数如何处理清理工作,并指出其带来的利用可能性。

       详细分析`rtdl_fini()`函数的实现和依赖的`rtld_global`数据结构,指出其攻击面。通过动态调试,明确如何劫持`rtld_global`中的函数指针,实现获取shell。进一步探讨如何利用`l_info`伪造`fini_array`节,将其迁移到可控制的位置,并在其中写入函数指针,实现多个函数的调用。

       在劫持`fini_array`后,我们具备了连续调用多个函数的能力,探讨如何将这种能力与ROP相结合,完成复杂操作。分析`fini_array`中函数的调用过程,利用寄存器环境的稳定性和栈环境的特性,设计利用策略,如利用`gets()`和`setcontext`实现SROP。

       利用`fini`段进行攻击相对简单,但只能执行一个函数,通常设置为`ogg`。通过修改`rtld_global`中的`l_info`指向`fini`段的函数指针,实现特定函数的调用。

       回顾`exit()`函数的清理流程,除了调用清理函数链表外,还有调用`__libc_atexit`中的默认清理函数。总结分析内容,强调对清理机制的理解和利用方法。