首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

吴章金: 如何创建一个*可执行*的共享

共享目标文件(.so,共享),协同可执行文件创建进程映像 Core dump(core),运行过程中崩溃自动生成,用于调试 我们来看中间两类: 可执行文件 如果不引用外部库函数,那么所有符号地址是确定的...,执行加载后可直接运行 共享 如果可执行文件用到外部库函数,那么需要通过动态链接器加载引用到的共享并在运行时解析用到的相应符号 所以,前者和后者通常情况下是独立存在的,是联合行动的,两者差异明显:...可执行文件有标准的 C 语言程序执行入口 main,而共享则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址链接是相对的,在装载动态分配和计算符号地址 接下来做个实验具体看看两者的区别.../libhello.so Segmentation fault (core dumped) 直接执行失败,再试试如何生成一个可执行文件加载运行它,这个是引用共享的通常做法: $ gcc -m32 -...先来回顾一下共享本文第 2 节直接执行的时候马上出段错误,基本原因是共享没有强制提供一个标准的 C 程序入口。

1.1K20

BabyNote - musl 1.2.2 pwn

可以尝试伪造 fake stdout 并将指针写到 stdout_used,fake stdout 的头部可以写为"/bin/sh\x00",write指针写为 system 指针,这样当 exit() 就会触发...的初始堆地址二进制文件的地址空间中) 再用一种堆风水思路借助UAF构造fake note占用掉发生UAF的原note,构造指针进行任意地址泄露,重复该步骤两次分别泄露libc地址和__malloc+context.../libc.so /usr/lib/x86_64-linux-musl/libc.so,如果怕覆盖掉本地的musl可以先mv备份 开启和关闭ASLR会导致某个常量发生变化,调试的时候记得手动修改一下(见注释.../musl-1.2.2/src/malloc/mallocng加载malloc相关的调试符号free的时候带源码调试可以很方便检查程序流卡在哪个assert) EXP: from pwn import.../libc.so /usr/lib/x86_64-linux-musl/libc.so p = process(".

68810
您找到你想要的搜索结果了吗?
是的
没有找到

静态 VS 动态

静态是.o的集合,printf在其中的某个.o中,链接静态,使用printf这个符号去搜索静态中所有的.o,如果找到了printf所在的.o,将其链接到自己的程序中。...链接动态 链接动态,collect2/ld不会将动态中.o的代码直接静态链接(复制)到自己程序中,只会留下调用接口。...程序运行时再去将动态(链接)加载到内存中,然后就能调用动态的函数(代码)了。 动态的优点 不管多少程序使用了这个动态,这些程序只会共享使用同一份的动态,因此动态也被称为共享。...如果没有:到硬盘上找到libc.so,将所有代码加载(动态链接)到内存中,并得到整个动态在内存中的起始地址。如果有:说明之前有人已经加载过了,所以不再加载,直接得到动态在内存中的起始地址即可。...printf的地址 = printf的相对地址 + 动态加载的地址 相对地址 编译并不知道动态加载到什么位置,编译器其实并不知道printf函数第一条指令的绝对地址,所以编译printf只是一个相对地址

26010

如何在Linux上获得错误段的核心转储

gdb 中得到堆栈调用序列 你可以像这样用 gdb 打开一个核心转储文件: 1. $ gdb -c my_core_file 接下来,我们想知道程序崩溃的堆栈是什么样的。... gdb 提示符下运行 bt 会给你一个调用序列(backtrace)。我的例子里,gdb 没有为二进制文件加载符号信息,所以这些函数名就像 “??????”。...幸运的是,(我们通过)加载符号修复了它。 下面是如何加载调试符号。...1. symbol-file /path/to/my/binary 2. sharedlibrary 这从二进制文件及其引用的任何共享加载符号。...一旦我这样做了,当我执行 bt gdb 给了我一个带有行号的漂亮的堆栈跟踪! 如果你想它能工作,二进制文件应该以带有调试符号信息的方式被编译。

4K20

CSAPP---第七章-链接

这里涉及到CSAPP第九章要讲的虚拟内存机制,该章节中会探讨如何实现共享 静态共享构造对比如下: 动态链接基本的思路是当创建可执行文件,静态执行一些链接,然后程序加载,动态完成链接过程...加载不会像它通常所做地那样将控制传递给应用,而是加载和运行这个动态链接器。 然后,动态链接器通过执行下面的重定位完成链接任务: 重定位 libc.so 的文本和数据到某个内存段。...从这个时刻开始,共享的位置就固定了,并且程序执行的过程中都不会改变。...共享目标文件共享)是在运行时由动态链接器链接和加载的,或者隐含地调用程序被加载和开始执行时,或者根据需要在程序调用 dlopen 的函数。...加载加载器将部分链接的可执行文件映射到内存,然后调用动态链接器,它通过加载共享和重定位程序中的引用来完成链接任务。

83310

深入了解GOT,PLT和动态链接

可对于动态链接而言就比较麻烦, 如果每个.so文件都要求加载到某个绝对地址, 那简直是个噩梦, 因为你无法保证不和别人的.so加载地址冲突. 所以就有了位置无关代码的概念....后者是symbol.c中定义的, 所以其内容在编译期 未知. 如果是静态链接, 则可以链接解析符号的值. 我们这里主要考虑动态链接的情况....这是链接器执行链接实际上要填充的部分, 保存了所有外部符号的地址信息....而第一次加载之后, 对于后续的调用就可以直接跳转而不需要再去加载. 这样一方面减少了进程的启动开销, 另一方面也不会造成太多额外的运行时开销, 所以延时加载在当今也是广泛应用的一个思想....不过前提是要知道libc.so在运行时的加载地址. 如果没启用ASLR, 这个地址是固定的.

1.2K10

【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态中的 load 函数地址 并 通过 远程调用 执行该函数 )

的缩写 , 该函数的作用是 根据 动态链接 句柄 和 符号 , 返回对应 符号的地址 , 这个符号可以是方法名 , 也可以是变量名 ; 包含头文件 : #include 函数原型.../ 可执行文件 中的某个方法的地址 , 参考 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态中的...( 注入代码分析 | 远程调用 目标进程中 libc.so 动态中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 ) 博客 , 通过 设置 EIP 寄存器 , 设置要执行的函数指令地址...动态的代码 , 该换行代码中 , 只是调用 dlopen 函数加载了真正的 libnative.so 动态 , 这个动态是进行逆向操作的主要的 , 执行核心逻辑 ; 先远程注入 libbridge.so...动态 , 然后远程调用 libbridge.so 中的 load 函数 , 将真正的 libnative.so 加载到目标进程中 ; 使用修改寄存器的方法 强行加载 libbridge.so 动态

77910

有关RouterOS的后渗透研究

启动,squashfs文件系统将被提取并安装到/pckg/目录中(或者根据安装方法进行符号链接)(对于系统包来说,这并不完全正确,但我们可以忽略这一点)。 ? Squashfs是只读的。...显然,真正的攻击者可以从共享对象执行任何操作,但是为了概念验证,我直接从构造函数创建了6.41+后门文件。 ? PoC甚至会停止并重启SNMP进程,以确保不重启系统的情况下加载共享对象。 ?...由于/pckg/位于tmpfs空间,因此即使PoC没有删除脚本,脚本创建的目录结构也会在重启被删除。 与上面类似,我发现我可以从/flash/rw/lib中获取系统二进制文件加载。...从/rw/lib/加载的好处在于,因为它是持久的文件空间,共享对象将在重启后保持不变。唯一的挑战是弄清楚我们想要劫持哪个。显而易见的选择是libc.so,因为它可以保证在任何地方都能加载。...RouterOS没有为普通用户提供创建符号链接的方法,因此你只能通过利用来实现。但RouterOS也不会尝试删除符号链接。

2.2K20

《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接

链接可以执行于编译( compile time),也就是源代码被翻译成机器代码;也可以执行于加载( load time),也就是程序被加载器(lad er)加载到内存并执行时;甚至执行于运行时...链接器产生的可执行目标文件重要的系统功能中扮演着关键角色,比如加载和运行程序、虚拟内存、分页、内存映射。 理解链接将使你能够利用共享。...共享目标文件共享)是在运行时由动态链接器链接和加载的,或者隐含地调用程序被加载和开始执行时,或者根据需要在程序调用dlopen的函数。   ...加载器将可执行文件的内容映射到内存,并运行这个程序。链接器还可能生成部分链接的可执行目标文件,这样的文件中有对定义共享中的例程和数据的未解析的引用。...加载加载器将部分链接的可执行文件映射到内存,然后调用动态链接器,它通过加载共享和重定位程序中的引用来完成链接任务。

2.6K31

Android基础开发实践:如何分析Native Crash

Linux中对信号的定义signum.h文件中: ? 4.2 FaultManager 除了SignalCatcher,Runtime启动的时候会创建一个FaultManager, ?...tombstone文件是在出现Native Crash的崩溃转储文件,一般最多保存10个文件,如果有新的Crash则会覆盖掉旧的文件。 ?...文件,需要注意一点是,如果是SIGABRT信号,一般会有一条Abort Message,这条信息基本上可以说明该问题出现的原因,比如jni参数空指针之类(SIGABRT信号一般出现在assert失败产生的...对应的虚拟内存映射区域名称(通常是共享或可执行文件):/system/lib/libc.so 4. PC 值对应的符号:tgkill 5....如果是因为加载so或者link so导致的问题,本人实现了几个脚本,可以方便地获取到so文件之间的依赖关系(便于确定加载so的顺序),以及从大量的so中查找特定符号或者Java 类名。

17K153

动态与静态

形成一个可执行程序,可能不仅仅只依赖一个!而gcc的默认是动态链接,但是当提供的是静态,并不能说gcc不会使用静态,事实证明,不管是动态还是静态,都可以使用。...一个程序在编译完成后,还没加载到内存,就已经有了自己的代码区等,此时程序所用到的静态被拷贝到代码区里面!...,开始加载加载到内存,加载后,把这块内存通过页表,映射到虚拟空间的共享区,接着就会立马确定了这个的起始地址!...此时,因为我们要访问的printf所在的地址空间中,已经有了偏移量,然后可以去访问共享区,找到动态的起始地址,然后拿着这个起始地址+偏移量,共享区的libc.so这个库里面找到这个函数,然后调用,调用完之后返回代码区继续往后执行...理顺过程:可执行程序里面遇到了printf,OS就识别到了printf是属于libc.so的,然后加载,拿到起始地址,接着拿着起始地址+偏移地址共享区中的库里面找到这个函数调用,最后返回到代码区中继续执行下面的代码

2.2K30

黑客级别的文章:把动态的内存操作玩出了新花样!

当一个动态加载到内存中,动态链接器就是读取这个section的内容,比如: 依赖于其他哪些共享对象; 动态链接符号表的位置(.dynsym); 动态链接重定位表的位置; 初始化代码的位置; ......这样的话,动态的代码段加载到物理内存中之后,就可以被多个不同的进程来共享了,只要把代码段的物理地址,映射到每个进程自己的虚拟地址即可。...链接器把所有被依赖的共享对象加载到内存中,会把每个共享对象中的符号给汇总起来,得到全局符号表。 然后再检查每个共享对象中的 .rel.plt,是否需要对一些地址进行重定位。...动态在被加载到内存中,因为存在加载顺序的问题,所以加载地址不是固定的。 还有一种说法:对于某一个进程而言,它在被加载到内存中,它所依赖的所有动态的顺序是一定的。...可能的原因是: 进程的内存空间是多线程共享的,我们执行 hook ,其他线程(甚至 linker)可能正在执行 dlclose(),或者正在用 mprotect() 修改这块内存区域的访问权限。

1.2K20

使用VMWare GDB和IDA调试Windows内核

本文主要讲解了如何使用IDAPython脚本来让IDA处理已经加载的模块列表和加载符号。...已经能够获取内核模块列表固然不错,但是如果不能加载符号那么上面的工作也就没有多少用处。...我们可以通过IDA的File->LoadFile->PDB file手动为每个模块加载符号,但是这样做太蛋疼了。为什么不让它自动加载呢?...图10 点击yes之后就开始加载符号了,但是比较繁琐的是每次加载一个新的模块的符号都会弹出图09种的确认窗口,直到所有的模块的符号加载完毕。...这也是个痛苦的过程~ 执行完脚本之后再来看下程序的内存镜像将会是如图11所示。 图11 再来看下名称窗口可以发现只要加载符号的模块中的名称都已经显示出来了,如图12所示。

1.4K30

Linux64位程序中的漏洞利用

这是因为x86传递地址不会进行"验证”. 而x64则会对根据寻址标准对地址进行检查, 规则是48~63位必须和47位相同(从0开始), 否则处理器将会产生异常....关键是要找到合适的gadget, victim里找到了这俩字节, 就算不幸没找到也没关系, 我们还可以从libc.so里去找, 这个会在后面细说....如果可执行文件不是PIE(位置无关可执行文件), 那么ELF的加载地址也是固定的. 这就使得我们可以通过跳转到PLT来绕过ASLR执行任意 命令....找啊找啊找libc 虽然libc.so是PIC位置无关的, 但其中每个符号的相对地址是确定的, 只要知道其中一个, 就能知道libc加载基地址和所有其他符号的位置了...., 主要利用的是Linux 实现ASLR的设计缺陷, 程序启用PIE时会导致加载地址空间(区域)和动态相同, 从而导致ASLR熵减少.

1.2K70

含大量图文解析及例程 | Linux下的ELF文件、链接、加载(中)

例如,一个“可加载只读”段可以由可执行代码区段、只读数据区段和动态链接器需要的符号区段组成。...… 例子:静态ELF加载器,加载 a.out 执行 我们同样以刚才介绍静态链接的a.c、b.c、main.c的例子来看一下静态链接的可执行文件加载。...我们接着用gdb来调试: 上图是笔者gdb中调试的一些内容: 我们用starti来使得程序第一条指令就停下,可以看到,程序确实是从0x400180开始的,与我们上面查到的入口地址一致。...而且这只是链接了libc标准大型项目中,我们要链接各种各样的第三方,而静态链接会把全部链接就链接到同一个可执行文件,那么其大小是很难接受的。 动态的出现正是为了弥补静态的弊端。...可以看到动态链接器的路径.interp这个段中体现,并且通常它是个软链接,最终链接在像ld-2.27.so这样的共享上。

2.3K20

Linux内核级木马与病毒攻防:基础工具介绍

本节先介绍几种Linux系统上极为强大的工具。 第一个当然是gdb了,Linux上,它是唯一能用于程序调试的利器。...我们后面开发代码或调试分析其他病毒或木马的设计模式和原理,必须使用gdb作为手术刀,对要研究的病毒和木马进行”剖尸检验“,通过gdb调查木马或病毒的代码设计方法,同时也使用gdb加载恶意代码,研究其运转流程...使用如下命令可以查看程序调用系统API Read 读入的数据: strace -e read ./sys_read 执行后结果如下图: ? 可以看到read函数读入的内容被显示出来。...另外一个类似工具叫ltrace,它的作用是能发现程序执行时加载了那些动态链接,同时打印出程序对链接库内的函数调用。.../proc/24869/maps 如此可以读取该进程被加载运行时的内存布局和相关信息。同时文件/proc/kcore对应内核符号表,利用gdb加载文件就可以对内核进行调试和分析。

1.5K10

Android 平台 Native 代码的崩溃捕获机制及实现

但即使我们自己信号处理程序中不使用不可重入的函数,也无法保证保存的旧的信号处理程序中不会有非异步信号安全的函数。所以要使用alarm保证信号处理程序不会陷入死锁或者死循环的状态。...(1) dladdr() pc值是程序加载到内存中的绝对地址,我们需要拿到奔溃代码相对于共享的相对偏移地址,才能使用addr2line分析出是哪一行代码。...通过dladdr()可以获得共享加载到内存的起始地址,和pc值相减就可以获得相对偏移地址,并且可以获得共享的名字。...(3) /proc/self/maps:检查各个模块加载在内存的地址范围 Linux系统中,/proc/self/maps保存了各个程序段在内存中的加载地址范围,grep出共享的名字,就可以知道共享加载基值是多少...得到相对偏移地址之后,使用readelf查看共享符号表,就可以知道是哪个函数crash了。 ?

5.2K116

含大量图文解析及例程 | Linux下的ELF文件、链接、加载(下)

比如,程序的启动代码,放在内存映射的起始处,执行main函数之前执行以及程序终止后完成一些任务编译动态,链接器没有添加这部分代码。这是可执行文件和动态之间的区别。...实际上,它就是动态链接文件的链接加载器。我们之前已经介绍过,动态链接的可执行文件中,外部符号的地址程序加载、运行的过程中才被确定下来。这个链接加载器 ld 就是负责完成这个工作的。...共享和静态的区别:链接libc共享只是指定了动态链接器和该程序所需要的文件,并没有真的做链接,可执行文件调用的libc库函数仍然是未定义符号,要在运行时做动态链接。...而在链接静态,链接器会把静态中的目标文件取出来和可执行文件真正链接在一起。 静态链接后,指令由相对地址变为绝对地址,各段的加载地址定死了。...共享链接后,指令仍是相对地址,共享各段的加载地址并没有定死,可以加载到任意位置。

1.3K21
领券