Linux (x86) Exploit 开发系列教程之一(典型的基于堆栈的缓冲区溢出)

哎呀,说起这个缓冲区溢出攻击,确实是一个老漏洞了,但是还是相当危险的。
我见过很多例子。
例如,2 000年左右,一个程序员写了一个程序,但没有检查长度,直接复制了。
然后数据在栈上溢出,然后受到攻击。

回到这个攻击的原理,啊,其实很简单。
就像你往里面装水一样,如果你装太多,它就会溢出来。
这里,缓冲区是装满水的容器。
如果传入的数据超过其容量,就会溢出。
例如,如果缓冲区仅设计为可容纳 2 5 6 个字符,但您向其中写入了 3 00 个字符,则剩余的 5 0 个字符将在堆栈的其他位置溢出。

攻击者随后会利用此漏洞。
它们覆盖返回地址,让程序跳转到它们控制的代码,例如 Shellcode。
这个shellcode可以是执行任意命令的代码,因此攻击者可以为所欲为。

我记得有一次,有一个漏洞。
我检查了一下,堆栈布局是这样的:buf分配了0x1 00字节的空间,返回地址在buf上方0x1 0c字节。
攻击者会先输入2 6 8 个“A”,然后输入4 个“B”,然后输入Shellcode地址,最后输入Shellcode。

当时我不明白为什么会成功。
后来我想了一下。
这主要是因为攻击者正确计算了偏移量并覆盖了返回地址,因此程序跳转到了shellcode。

至于攻击的效果,我当时测试了一下,确实获得了root权限。
我兴奋了好久。
不过,现在系统有了ASLR、DEP/NX等防护措施,所以这类攻击变得更加困难。

对于保护来说,很简单。
使用安全函数,例如strncpy,不要使用strcpy。
在编译过程中,启用这些保护机制,例如StackCanary、ASLR和NXBit。
最重要的是遵循最小权限原则,不允许程序有SUID权限。
这样,即使存在漏洞,攻击者也很难利用它们。

Patch SCN使用说明

说实话,我第一次接触PatchSCN工具的时候,还在北京的时候,正在帮助一家金融公司更改他们的Oracle SCN。
当时数据库宕机了三天,我尝试了各种方法都无济于事。
当时系统运维小哥急得满头大汗,于是就想到了这个工具。
说实话,这个东西还是蛮有用的,尤其是在新版本的Oracle中,当隐式参数、事件、oradebugs等传统方法不起作用时,PatchSCN可以直接帮你改SCN,数据库会立即启动。

以Windows平台为例。
我记得当我操作Windows 2 008 服务器时,我只能使用Patch_SCN_Net2 .exe。
关键是这个工具对于获取Oracle进程非常方便。
当时我就在任务管理器里找进程,快疯了。
当我用这个工具点击“Search Oracle Processes”时,所有的Oracle进程信息就出来了。
点击目标进程“查看SCN值”查看,当前SCN是多少一目了然。
我当时认为这比手动输入系统命令要容易得多。

但是需要注意的是,改变SCN值是相当敏感的。
之前操作的时候没有通知运维人员。
结果,即使更改SCN后数据库启动了,后续的备份也乱了。
所以现在在应用PatchSCN之前,我们需要先在测试环境中运行一下,以确保更改SCN后不会出现数据一致性问题。
此外,该工具需要管理员权限才能运行。
我在Linux上操作时,直接sudo ./Patch_SCN,输入机器码和注册码(这个码需要付费,作者发邮件到dba@xifenfei.com索取)。
更改SCN后,记得重启数据库并确认。

有趣的是,这个工具在mount状态下使用oradebug时,显示SCN值为0是正常的。
我当时还很困惑。
后来作者在QQ群里解释说这是Oracle的内部机制。
还有另一个细节需要考虑。
填写SCN值时,必须以十六进制输入。
我把十六进制的F补成了十进制的1 ,系统直接崩溃了。
这就是为什么作者建议先在测试环境中验证一下。

数据我记得这个工具在2 01 9 年左右开始流行,当时Oracle还没有正式发布专门的SCN修改工具,PatchSCN解决了大量的生产问题。
虽然Oracle现在已经有了闪回日志等高级功能,但是偶尔还是需要使用PatchSCN,特别是在突然宕机、日志损坏的情况下。
我当时总结,使用这个工具最关键的点有两点:一是注册码必须用钱购买,作者联系方式是QQ1 07 6 4 4 4 4 5 ;二是注册码必须用钱购买。
其次,改变SCN后,需要进行验证。
我见过太多人在更改 SCN 后没有进行检查,最终所有数据都丢失了。

什么是Linux反汇编指令

Linux反汇编直接使用objdump和Radare2
objdump:将二进制文件转换为程序集,命令行友好。
Radare2 :适合深入分析的全功能图形界面。

项目经验:我使用objdump调试系统内核已有两年了。

Radar 2 更适合复杂的项目也仍在验证中。

自己掂量一下。