我们在写完代码后,进行简单的编译,然后在 shell 命令行下就可以把它启动起来。
作者简介: 伟林,中年码农,从事过电信、手机、安全、芯片等行业,目前依旧从事Linux方向开发工作,个人爱好Linux相关知识分享。 原理概述 为什么要研究链接和加载?写一个小的main函数用户态程序,或者是一个小的内核态驱动ko,都非常简单。但是这一切都是在gcc和linux内核的封装之上,你只是实现了别人提供的一个接口,至于程序怎样启动、怎样运行、怎样实现这些机制你都一无所知。接着你会对程序出现的一些异常情况束手无策,对内核代码中的一些用法不能理解,对makefile中的一些实现不知所云。所以这就是我们
一种是固定的、静态的连接,就是把需要用到的库函数的目标代码(二进制)代码从程序库中抽取出来,链接进应用软件的目标映像中;
在 《漫画解说内存映射》一文中介绍过 虚拟内存 与 物理内存 映射的原理与过程,虚拟内存与物理内存进行映射的过程被称为 内存映射。内存映射是硬件(内存管理单元)级别的功能,必须按照硬件的规范设置好内存映射的关系,进程才能正常运行。
首先看linux进程在32位处理器下的虚拟空间内存布局,以i386 32位机器为例
本篇文章晚了两三天发,说明一下原因哈,最近在搞TSRC和青藤云的webshell挑战赛,时间被挤压了,文章会晚到,但不会缺席,继续今年的Flag。突然发现写完凌晨三点了,赶紧睡觉。。。
欲成其事先利其器。要想完成一项复杂的任务,工具的作用至关重要。要想在Linux系统上开发或研究木马病毒等特殊程序,我们需要使用一系列强大的开发和调试攻击。本节先介绍几种在Linux系统上极为强大的工具。
本文介绍了ELF的基本结构和内存加载的原理,并用具体案例来分析如何通过ELF特性实现HIDS bypass、加固/脱壳以及辅助进行binary fuzzing。
可执行文件的装载 进程和装载的基本概念的介绍 程序(可执行文件)和进程的区别 程序是静态的概念,它就是躺在磁盘里的一个文件。 进程是动态的概念,是动态运行起来的程序。 现代操作系统如何装载可执行文件 给进程分配独立的虚拟地址空间 将可执行文件映射到进程的虚拟地址空间(mmap) 将CPU指令寄存器设置到程序的入口地址,开始执行 可执行文件在装载的过程中实际上如我们所说的那样是映射的虚拟地址空间,所以可执行文件通常被叫做映像文件(或者Image文件)。 可执行ELF文件的两种视角 可执行ELF格式具有不寻常的
最近在研究ARM cpu 32 bit转码 64bit的事情,以用于在64bit的服务器上可以更快的运行32bit的Android ELF文件。
在Linux下,elf文件有三类,分别是: relocatable , shared object, executable. 见下面的例子:
🚀🚀这个地方的代码还是很简单的,主要就是去哪找CCM的地址,不过也不算难找,比如CCGR0,就是0x020c4068。
Windows 基本占领了电脑时代的市场,商业上取得了很大成功,但是它并不开源,所以要想接触源码得加入 Windows 的开发团队中。
我们前面提到了, fork, vfork等复制出来的进程是父进程的一个副本, 那么如何我们想加载新的程序, 可以通过execve来加载和启动新的程序。
一. 简述 Android中的so文件是动态链接库,是二进制文件,即ELF文件。多用于NDK开发中。
在本系列的第 1 部分和第 2 部分,我们介绍了 eBPF 虚拟机内部工作原理,在第 3 部分我们研究了基于底层虚拟机机制之上开发和使用 eBPF 程序的主流方式。
大家好,我是 ELF 文件,大名叫 Executable and Linkable Format。
ELF(Executable and Linkable Format)是一种可执行文件和可链接文件的标准格式,用于在Linux和Unix系统中存储程序和库文件。它是一种二进制文件格式,包含程序的代码、数据、符号表、段表等信息。
最近在玩树莓派,觉得这个树莓派的启动过程有点意思。所以在收集很多信息之后,个人也进行了一些实验和总结。先看一段原始资料:
1.新装系统后 需要设置su密码: 方法 sudo passwd 提示“Enter new UNIX password” 退出root:su 用户名
熟悉高通平台的童鞋可能会比较熟悉,高通有ramdump功能,当系统crash后通过warm reset重启来抓取ram中的数据,然后利用Trace32进行故障现场的查看来排查问题。这实际上用到的就是trace32的simulator功能,也就是仿真器功能,我们只需要获取到设备的内存快照来进行指令集的仿真,以此查看故障现场,而不用真实的连接目标板来实时调试。
本次案例用到的是创龙科技的TLZ7x-EasyEVM-S开发板,它是一款基于Xilinx Zynq-7000系列XC7Z010/XC7Z020高性能低功耗处理器设计的异构多核SoC评估板,处理器集成PS端双核ARM Cortex-A9 + PL端Artix-7架构28nm可编程逻辑资源,评估板由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。
前几天,读者群里有小伙伴提问:从进程创建后,到底是怎么进入我写的main函数的?
本文简要介绍了新增的 15 种执行代码的方式,另外详细介绍了该课程提供的所有实验材料。"
在上周的一篇转载文章中,介绍了一种如何把一个动态库中的调用函数进行“掉包”的技术,从而达到一些特殊的目的。
之前写过一篇文章 Linux下c语言中的main函数是如何被调用的,该篇文章侧重于从user space层面讲程序的运行,而文章中提到的有关kernel space层面的相关系统调用,比如fork、execve等,都被一笔带过。
我一直认为战略上蔑视技术,战术上重视技术是很有必要的学习态度。这是一篇 Bringup SoC 芯片的指导手册,更是一篇了解整个系统流程的地图。不会深入了解每个模块的细节,但提供了整个系统的宏观描述,让你站在上帝视角俯视每个知识点,为了对读者更负责,我打算以付费的方式和大家见面,对技术细节有需求的小伙伴欢迎加我微信(rrjike)交流,保证超有所值。 系统在启动的时候,无论是 ROM 加载 Uboot(SPL + Bootloader),还是 Uboot 加载 Kernel,都是把相关的镜像放到对应的内存不
就会出现如下结果。ps 在此处,我们可以人为ls为可执行程序的名称,--version 是该程序需要的参数。
那么多对于我们初学者来说要学习哪种风格呢?答案是肯定的,学习GNU风格的汇编代码,因为做Linux驱动开发必须掌握的linux内核、uboot,而这两个软件就是GNU风格的。
最近添加了些我觉得可能有用的东西,今天要介绍的就是dropper和packer两个新功能。
随着 Android 开发的技术宽度不断向 native 层扩展,Native hook 已经被用于越来越多的业务场景中,之前作者一直游离于Java层面的逆向,后来工作使然,接触到了Native 层的Hook,熟悉了ELF的文件结构&GOT/PLT&In Line Hook的相关知识和实际操作,Android Native Hook 的实现方式有很多种,我们接下来要讲的是 GOT/PLT Hook (篇幅略略略长,阅读时长约 20 min )
一个程序内存分配: 下图是APUE中的一个典型C内存空间分布图(虚拟内存) 例如: #include int g1=0, g2=0, g3=0; int max(int i) { int m1
简单总结下C++变量在内存中的布局和可执行文件相关的知识。暂未涉及虚函数,虚函数表,类的继承和多态等C++对象的内存模型。对象的内存模型推荐经典书籍《 深度探索C++对象模型》,豆瓣评分9.1。
Nimbo-C2是一款功能强大的轻量级C2 框架,Nimbo-C2代理支持x64 Windows&Linux操作系统。该工具基于Nim和Python开发,其WIndows端使用了.NET组件。Nim的功能非常强大,但在跟Windows系统交互时使用PowerShell可能会更加简单,因此该工具的部分功能是基于PowerShell实现的。Nimbo-C2的Linux代理更加的精简,只能执行基本命令,其中包括ELF加载(通过memfd技术实现)等。
1, 编译器编译源代码生成的文件叫做目标文件。 从结构上说,是编译后的可执行文件,只不过还没有经过链接 3.1 目标文件的格式 1,可执行文件的格式: Windows下的PE 和 Linux下的ELF 2,从广义上说,目标文件与可执行文件的格式几乎是一样的,所以广义上可以将目标文件与可执行文件看成是一种类型的文件。 3,可执行文件,动态链接库,静态链接库都按照可执行文件格式存储(Windows下是 PE-COFF格式,Linux下是ELF格式)。 4,Linux下命令: $: file ***
预处理:gcc -E -o hello.cpp hello.c -m32 (源代码)
EXP Template #coding:utf-8 import sys from pwn import * from one_gadget import generate_one_gadget # context.terminal = ["tmux","splitw","-h"] context.terminal = ["tmux","new-window"] context.log_level = "debug" ### 远程本地连接 def ProLoc(elf_addr,libc_addr,pr
要想了解底层,链接是一个不得不过的一关,我总结了下学习的心得,首先要了解链接器到底是如何工作的,链接器分为两类,一个是静态链接,一个是动态链接,先来讲解静态链接,静态链接要干两件事:
我们在编写代码的时候经常用到已有的接口,他们是以库的形式提供给我们使用的,而常见形式有两种,一种常以.a为后缀,为静态库;另一种以.so为后缀,为动态库。那么这两种库有什么区别呢?
常用工具 我们首先列出一些在接下来的介绍过程中会频繁使用的分析工具,如果从事操作系统相关的较底层的工作,那这些工具应该再熟悉不过了。不熟悉的读者可以先看一下这里的简单的功能介绍,我们会在后文中介绍一些详细的参数选项和使用场景。 另外,建议大家在遇到自己不熟悉的命令时,通过 man 命令来查看手册,这是最权威的、第一手的资料。 ELF文件详解 ELF文件的三种形式 在Linux下,可执行文件/动态库文件/目标文件(可重定向文件)都是同一种文件格式,我们把它称之为ELF文件格式。虽然它们三个都是ELF文件格式
先来分析一个简单的.lds链接脚本 例1,假如现在有head.c init.c nand.c main.c这4个文件: 1.1 首先创建链接脚本nand.lds: 1 SECTIONS { 2
例1,假如现在有head.c init.c nand.c main.c这4个文件:
ELF的英文全称是The Executable and Linking Format,最初是由UNIX系统实验室开发、发布的ABI(Application Binary Interface)接口的一部分,也是Linux的主要可执行文件格式。
前面章节我们了解了ELF文件的头部结构,这次我们深入了解另一个非常重要的数据结构,那就是程序表头。操作系统严重依赖该结构来加载ELF文件或是实现动态链接。程序表头反映的是当ELF加载到内存后所形成的“视图”或结构,也就是说ELF文件存在硬盘上或者被加载到内存,它展现出来的形态不一致。
①这里所谓的“二进制”,英文称为raw binary。这种程序只包含机器码。而ELF程序还包含有其它额外的信息,如段的加载地址,运行地址,重定位表,符号表。
在了解了共享对象的绝对地址的引用问题后,我们基本上对动态链接的原理有了初步的了解,接下来的问题是整个动态链接具体的实现过程了。动态链接在不同的系统上有不同的实现方式。ELF的动态链接的实现方式会比PE的简单一点,在这里我们先介绍ELF的动态链接过程在LINUX下的实现,最后我们会专门的章节中介绍PE在Windows下的动态链接过程和它们的区别
领取专属 10元无门槛券
手把手带您无忧上云