1.pwntools处理ELF文件中plt与got表获取
2.CTFer成长日记16:用动态生成的源码代码绕过程序的静态安全检查——shellcode敏感字节检测绕过
3.将一个指针 free 两次之后会发生什么?
pwntools处理ELF文件中plt与got表获取
在pwntool源码中,elf.py中的分析elffile处理ELF文件获取section。
elffile.py中的源码get_section逐个获取section_header,通过判断'sh_type'属性来确定section类型,分析方便后续处理。源码
ELF文件包含多种section,分析文章app 源码每种section类型在section header中有对应描述,源码例如:
ELF文件中的分析section类型包括但不限于:SHT_NULL(无效section header),SHT_PROGBITS(程序数据部分),源码SHT_SYMTAB/SHT_DYNSYM(符号表),分析SHT_STRTAB(字符串表),源码SHT_RELA/SHT_REL(重定位表),分析SHT_HASH(哈希表),源码SHT_DYNAMIC(动态链接信息),分析SHT_NOBITS(不占空间的源码section),SHT_SHLIB/SHT_LOPROC/SHT_HIPROC/SHT_LOUSER/SHT_HIUSER(特殊用途section)。牌友联盟 源码
依据section类型,elffile.py中的_make_section函数调用特定类进行处理。例如,针对SHT_HASH,调用_make_elf_hash_section,并最终指向ELFHashSection,用于从ELF文件读取section数据。
获取ELF文件的section后,可以进一步获取symbol表、plt表与got表。
在_populate_symbols函数中,判断section是否属于SymbolTableSection,对应于_make_section()中检测sectype为SHT_SYMTAB、SHT_DYNSYM或SHT_SUNW_LDYNSM。iter_symbols返回sec._symbols,更改termux源码每个symbol对象包含name和value,若value非零,则将name和value关联存入self.symbols。
在_populate_got中,处理静态链接时关注relocation section,对应sectype为'SHT_REL'和"SHT_RELA'。若symbol和name非空,则对self.got进行赋值。
在_populate_plt中,首先处理self.got和self.symbols,读取到内容后,将section.data()的范围内,即以section.header.sh_addr为起始地址,以section.data()长度为范围,4字节对齐进行扫描。2018电视源码选取对应函数和其地址存入self.plt。
最终,通过这些步骤,实现了对ELF文件中self.symbols、self.got和self.plt的获取。
CTFer成长日记:用动态生成的代码绕过程序的静态安全检查——shellcode敏感字节检测绕过
敏感字节检查绕过的基本原理,关键在于利用程序执行的动态特性。在执行时,若目标程序能允许某段内存被读写执行,我们就能尝试将shellcode注入,借此劫持程序执行流至shellcode首地址,实现ret2shellcode攻击。
然而,目标程序往往会对输入进行检查,发现敏感字节序列,microchip电机源码如syscall、int等指令对应的机器码时,会拒绝输入,导致攻击失败。解决之道在于,编写一段可动态生成shellcode的代码。此代码本身不是shellcode,但能在执行中自动生成shellcode并执行,以此绕过敏感字节检查。
理解ret2shellcode攻击过程后,我们能设想编写代码动态生成shellcode。具体方法是删除或替换敏感字节,并在执行时恢复。通过对比原始与修改后的shellcode,我们发现,关键在于修改自身shellcode的代码。
为了生成直接可用的shellcode,需修改原始shellcode,确保满足特定条件,即敏感字节序列指令在执行前恢复。将用于修改自身的shellcode片段置于shellcode头部,确保敏感字节指令被执行前恢复,实现绕过。
接下来,通过实例题验证上述方法的有效性。自定义源代码,使用特定命令编译,关闭程序的防御机制。通过内存布局,利用shellcode长度与main函数返回地址之间的偏移,实现攻击。
针对原始shellcode中的敏感字节,利用pwntools提供的shellcraft.sh()函数修改,首先删去syscall指令,接着在汇编代码头部添加修改自身shellcode的代码,尾部补全syscall指令对应的机器码。通过异或操作,将敏感字节序列转换为可接受的序列。
最后,解决的问题是获取shellcode尾部地址。通过输出shellcode首地址的程序,结合生成等效shellcode,利用脚本获取机器码长度,最终编写攻击脚本完成整个过程。
将一个指针 free 两次之后会发生什么?
当一个在 C 语言中通过 malloc 动态分配的内存,被 free 释放后,再进行第二次释放,这种行为被称为 double free,它在软件中常被视为一种潜在的二进制漏洞。一个具体的例子来自一道过去的 0ctf 竞赛,旨在通过逆向工程来理解其可能带来的风险。程序源代码可以在 github 上找到,环境为ubuntu . x_,使用了ida, pwntools, pwndbg等工具进行分析。
在逆向后的代码中,注意到关键点是,即使一个指针被 free 一次后,如果未被置空,它仍可能在后续执行中被误用,导致 double free。正确的做法是将空指针设置为 NULL,以保证安全。此外,代码中涉及了一个固定的存储区域,存储着 note0 字符串的地址,通过 double free 改变这个地址,可以影响程序的控制流,比如覆盖 got 表。
漏洞利用过程包括信息泄漏、chunk 的动态管理(如unlink函数导致的内存合并)以及伪造堆块以实现任意位置的读写。特别是通过覆盖 got 表,可以将 free 函数重定向到 system(),从而造成任意代码执行。
总的来说,double free 不仅可能导致内存混乱,更可能成为恶意攻击的入口。因此,开发者在编程时务必谨慎处理内存的分配和释放,以防止此类漏洞的发生。