在国赛半决赛中出现过的要求,就是修补漏洞,但是不能对原文件改动太大,不然过不了check。然后昨天看到今年国赛的决赛赛制,是awd。似乎是一队维护>=10个gamebox额,第一次打awd,听起来想放弃23333不如删掉flag文件算了,或者关机orz还是学学吧2333
IDA
对于缓冲区溢出的漏洞,可以使用IDA。啊,这个魅力无处安放的女人。
比如缓冲区大小比可读入的字节小,这时候就可以直接使用IDA,在对应的汇编指令处修改读入的字节数。然后应用到原文件中,这样改动不大也能完成修补,就很简便。
[此处应有例子]
LIEF
一个开源的跨平台库,可以解析、修改和抽象ELF、PE和MachO格式
安装
1 | pip install setuptools --upgrade |
使用LIEF增加段
源代码(64位)
1 | //vuln.c |
目的是将printf修改成自己的函数
首先编写自己的函数
使用gcc -Os -nostdlib -nodefaultlibs -fPIC -Wl,-shared func.c -o hook
编译
1 | //func.c |
方式一,修改got表
然后使用LIEF注入到文件中
1 | #!/usr/bin/env python3 |
然后执行注入后的程序
但是两个文件大小相差很大。。。
方式二,修改指定位置的call函数
使用以下脚本可以修改指定位置的call函数
1 | #!/usr/bin/env python3 |
修改.eh_frame段
这个段本身有可执行权限,而且本身作用不大(貌似跟处理异常相关)。这样可以将代码写在这个部分,然后程序变化也不会很大。
就可以直接将hook函数中的代码写到eh_frame段中去,然后修改call的跳转,完成patch
1 | bin_frame = binary.get_section('.eh_frame') |
这样就能直接跳转过来了
参考链接