使用ELF解析工具patch ELF

本文介绍如何使用LIEF工具将ELF可执行文件中的puts函数替换成system函数,通过具体示例展示了从安装配置LIEF到实现函数替换的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pacth打补丁:我理解的意思是在不影响可执行文件运行的基础下,修复问文件出现的问题。

lief可以轻松将任意函数添加到ELF导出表中:
https://lief.quarkslab.com/doc/latest/tutorials/08_elf_bin2lib.html
用处:
导出加密函数,直接dlopen来打开so。

这里使用quarklab的lief解析ELF文件并进行程序 patch:

lief主要特点:
解析:LIEF可以解析ELF,PE,MachO并提供一个用户友好的API来访问格式化内部。
修改:LIEF可以修改这些格式的某些部分
摘要:三种格式有 sections, symbols, entry point...等共同特征。
API:LIEF可以在C,C ++和Python中使用

lief程序地址

源程序:

//shell.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
  puts("/bin/sh");
  return EXIT_SUCCESS;
}

执行结果:

jay@ubuntu:~/Desktop$ ./a.out 
/bin/sh

需求:这里puts函数patch换为system

安装lief

python3.5
pip install --upgrade setuptools
pip install  lief
import lief
# 解析ELF文件
hashme = lief.parse("a.out")
print(hashme)
# 获取get puts函数的 Dynamic symbols
#python2中返回的是过滤后的列表, 而python3中返回到是一个filter类  加上.__next__() 是和原来等价的
puts_sym=filter(lambda e: e.name == "puts", hashme.imported_symbols).__next__()
print(puts_sym)
#将puts换为system
puts_sym.name = "system"
#改动写入新的文件 
hashme.write("a.out.patch")
print("done")

成功将puts函数换为system
执行后的效果如下:

jay@ubuntu:~/Desktop$ chmod 777 a.out.patch 
jay@ubuntu:~/Desktop$ ./a.out.patch 
$ id
uid=1000(jay) gid=1000(jay) groups=1000(jay),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
$ exit

demo代码:

参考:
https://github.com/lief-project/LIEF

https://mp.weixin.qq.com/s/m6BFv_xAwbM9UYjHfOfT6g

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值