ELF文件结构

ELF(Executable and Linkable Format)文件 可重定位文件(Relocatable File),包含由编译器生成的代码以及数据。链接器会将它与其它目标文件链接起来从而创建可执行文件或者共享目标文件。在 Linux 系统中,这种文件的后缀一般为 .o 。 可执行文件(Executable File),就是通常在 Linux 中执行的程序。 共享目标文件(Shared Object File),包含代码和数据,这种文件称为库文件,一般以 .so 结尾。一般情况下,它有以下两种使用情景: 链接器(ld)可能会处理它和其它可重定位文件以及共享目标文件,生成另外一个目标文件。 动态链接器(Dynamic Linker)将它与可执行文件以及其它共享目标组合在一起生成进程镜像。 ELF文件结构 ELF header(ELF头部):包含有关文件结构的基本信息,如文件编译的体系结构、文件类型(可执行文件、共享对象等)、可执行文件的入口点等。 Program header table(程序头表):描述了在加载和执行可执行文件时,操作系统如何处理文件的各个段(segments)的信息,包括段类型、段偏移、虚拟地址、物理地址、段大小、文件大小、段权限等。只有可执行文件和共享目标文件包含程序头表. Section header table(节头表):描述了ELF文件中每个分区的具体位置,包括节名称、节类型、标志、文件偏移、节区大小、链接信息、对齐信息、附加信息等。 段内容:一个段可能包括一到多个节区,这并不会影响程序的加载。通常包含代码段和数据段。 数据结构 文件头 include/elf.h #define EI_NIDENT (16) typedef struct elf32_hdr{ unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; /* Entry point */ Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } Elf32_Ehdr; Program header table(程序头表):e_phoff、e_phentsize、e_phnum、e_entry Section header table(节头表): e_shoff、e_shentsize、e_shnum、e_shstrndx(字符串表相关的表项的索引 值) e_ident: 0x00~0x03为 Magic Number(魔数), 0x04指定格式为32位/64位,0x05指定大端/小端模式,0x06为 elf文件版本,0x07为OSABI,0x08为ABI版本,0x09~0x0f为保留位。 e_type(目标文件类型,ET_NONE ET_REL ET_EXEC ET_DYN ET_CORE ET_LOPROC ET_HIPROC) e_machine(机器架构) e_version(文件版本) e_flags(处理器相关标志) e_ehsize(ELF文件头长度) 程序头表 #define PF_R 0x4 #define PF_W 0x2 #define PF_X 0x1 typedef struct elf32_phdr{ Elf32_Word p_type; Elf32_Off p_offset; Elf32_Addr p_vaddr; Elf32_Addr p_paddr; Elf32_Word p_filesz; Elf32_Word p_memsz; Elf32_Word p_flags; Elf32_Word p_align; } Elf32_Phdr; p_offset(偏移地址) p_vaddr(虚拟地址) p_paddr(物理地址) p_filez(文件中的大小) p_memsz(内存中的大小) p_align(对齐方式) p_type(段类型) PT_NULL:未使用 PT_LOAD:可加载段 PT_DYNAMIC:动态链接信息 PT_INTERP:此类型段给出了一个以 NULL 结尾的字符串的位置和长度,该字符串将被当作解释器调用。这种段类型仅对可执行文件有意义(也可能出现在共享目标文件中)。这种段在一个文件中最多出现一次。而且这种类型的段若存在,它必须在所有可加载段项的前面。 PT_NOTE:附加信息的位置和长度。 PT_SHLIB:保留 PT_PHDR:给出程序头表自身的大小和位置 PT_TLS:Thread-Local Storage Template(一种基于模板的通用方法,用于创建线程局部存储变量) PT_LOOS:保留范围(依赖操作系统) PT_HIOS:保留范围(依赖操作系统) PT_LOPROC:保留范围(依赖处理器) PT_HIPROC:保留范围(依赖处理器) p_flags(段权限) 代码段:包含只读的数据以及指令。通常包含....

三月 1, 2024 · 3 分钟 · 451 字 · Me

使用Hugo搭建个人博客

安装Hugo工具 export HUGO_VERSION=0.121.1 wget -O ./hugo.tar.gz https://github.com/gohugoio/hugo/releaserms/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz tar -xvf ./tar.gz sudo cp hugo /usr/bin sudo chmod +x /usr/bin/hugo 创建网站 hugo new site quickstart cd quickstart git init 设置博客主题 git submodule add https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod echo "theme: 'PaperMod'" >> hugo.toml hugo server 配置网站 baseURL: "https://example.com/" title: username paginate: 5 theme: PaperMod # 修复新帖子不渲染的问题 buildFuture: true # 设置网站默认显示语言 DefaultContentLanguage: "zh" DefaultContentLanguageInSubdir: true # 启用Robots.txt enableRobotsTXT: true buildDrafts: false buildExpired: false # 启用Google Analytics googleAnalytics: EXAMPLE 新建一篇文章 新建content/posts文件夹,在posts文件夹里新建Markdown文件即可,以下为示例...

一月 4, 2024 · 3 分钟 · 510 字 · Me

实现校园网自动认证的功能

由于校园网认证总是自己断掉,于是想到使用bash或python脚本认证校园网的方法,配合linux的cron可以方便的进行自动认证。 抓取登录时使用的get/post请求 打开chrome开发者工具,选择网络,勾选保留日志选项 输入用户名和密码并登录,找到对应的登录请求 以cURL格式复制值 我的校园网使用的是get请求 使用shell脚本认证 获取本机ip地址 ifconfig interface |grep inet|awk '{print $(NF)}'|head -n 1 # 替换为自己的网络接口 获取本机mac地址 ifconfig interface | grep ether| awk '{print $(NF-3)}' # 替换为自己的网络接口 编写认证脚本 CURRENT_IP=$(ifconfig interface|grep inet|awk '{print $(NF)}'|head -n 1) MAC_ADDRESS=$(ifconfig interface | grep ether| awk '{print $(NF-3)}') curl "http://192.168.251.75/quickauth.do?userid=userid&passwd=passwd&wlanuserip=${CURRENT_IP}&wlanacname=NFV-BASE&wlanacIp=202.206.32.195&ssid=&vlan=0&mac=${MAC_ADDRESS}&version=0&portalpageid=1&timestamp=1677389084992&uuid=d149ad07-e027-4f8b-aef3-206b5a4acf8e&portaltype=&hostname=" \ -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" \ -H "Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7" \ -H "Cache-Control: max-age=0" \ -H "Connection: keep-alive" \ -H "Cookie: macAuth=1f:78:63:0a:00:00||2b:7d:63:0a:00:00; ABMS=dbed4e41-6917-4d4e-8cce-f3c654b1e83c" \ -H "DNT: 1" \ -H "Upgrade-Insecure-Requests: 1" \ -H "User-Agent: Mozilla/5....

二月 26, 2023 · 1 分钟 · 192 字 · Me

rclone挂载云端网盘

安装rclone Debian sudo apt install rclone 配置云端网盘 rclone config 提示:支持Amazon Drive、Dropbox、Google Drive、Google Photos、OpenDrive、SFTP、Webdav等众多网盘。 新建挂载点 mkdir /path/to/mountpoint 挂载云端网盘 rclone mount remote_name:remote_path /path/to/mountpoint --daemon 进入挂载点目录 cd /path/to/mountpoint 不要忘记卸载云端网盘! fusermount -u /path/to/mountpoint 更多用法 复制 rclone copy 同步到目标目录 rclone sync 双向同步 rclone bisync 移动 rclone move 删除路径下的内容 rclone delete 删除路径及所有内容 rclone purge 检查目标与源是否匹配 rclone check 列出路径中所有对象的大小和路径 rclone ls 列出路径中的所有目录 rclone lsd 列出远程目录中所有对象的总大小和数量 rclone size 选项配置

二月 19, 2023 · 1 分钟 · 61 字 · Me

webdav解决局域网之间的文件传输问题

webdav方法说明 方法名称 文件权限 方法说明 OPTIONS – 支持 WebDAV 的检索服务方法 GET 读 获取文件 PUT、POST 写 上传文件 DELETE 删除 删除文件或集合 COPY 读、写 复制文件 MOVE 删除、写 移动文件 MKCOL 写 创建由一个或多个文件 URI 组成的新集合 PROPFIND 读 获取一个或多个文件的特性,实现文件的查找与管理 LOCK、UNLOCK 写 添加、删除文件锁,实现写操作保护 使用的服务端 nginx 注意:需要第三方模块nginx-dav-ext-module! 配置webdav目录权限 chown -R nobody:nobody /var/www/dav chmod -R 700 /var/www/dav 配置nginx服务器 dav_ext_lock_zone zone=davlock:10m; # DAV文件锁内存共享区 server { listen 443 ssl http2; # 启用HTTPS及HTTP/2 server_name yourservername; access_log logs/webdav.access.log main; #网站日志文件 root /var/www/dav; ssl_certificate yourpath/fullchain.pem; # 网站证书文件 ssl_certificate_key yourpath/privkey....

一月 12, 2023 · 2 分钟 · 244 字 · Me