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中使用
源程序:
//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