1.CTFer成长日记16:用动态生成的源码代码绕过程序的静态安全检查——shellcode敏感字节检测绕过
2.将一个指针 free 两次之后会发生什么?
CTFer成长日记16:用动态生成的代码绕过程序的静态安全检查——shellcode敏感字节检测绕过
敏感字节检查绕过的基本原理,关键在于利用程序执行的源码动态特性。在执行时,源码若目标程序能允许某段内存被读写执行,源码我们就能尝试将shellcode注入,源码借此劫持程序执行流至shellcode首地址,源码qq资源源码实现ret2shellcode攻击。源码
然而,源码目标程序往往会对输入进行检查,源码发现敏感字节序列,源码如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 不仅可能导致内存混乱,更可能成为恶意攻击的入口。因此,开发者在编程时务必谨慎处理内存的分配和释放,以防止此类漏洞的发生。