雪城大学信息安全讲义 4.5
5 堆或 BSS 的缓冲区溢出
堆或 BSS 的内容
- 字符串常量
- 全局变量
- 静态变量
- 动态分配的内存
示例:覆盖文件指针
/* The following variables are stored in the BSS region */ static char buf[BUFSIZE], *tmpfile;tmpfile = "/tmp/vulprog.tmp"; gets(buf); /* buffer overflow can happen here */... Open tmpfile, and write to it ...
- Set-UID 程序的文件指针指向了
/tmp/vulprog.tmp
。 - 程序需要在执行期间,使用用户输入写入文件、
- 如果我们可以使文件指针指向
/etc/shadow
,我们就可以使程序写入它。 - 我们可以使用缓冲区溢出来改变变量
tmpfile
的内存。通常,它指向了/tmp/vluprog.tmp
字符串。使用缓冲区溢出漏洞,我们就可以将tmpfile
的内容修改为0x903040
,它就是字符串/etc/shadow
的地址。之后,当程序使用tmpfile
变量打开文件来写入时,它实际上打开了shadow
文件。 - 如何寻找
/etc/shadow
?- 我们可将字符串作为参数传入程序,这样字符串
/etc/shadow
就储存在内存中。我们现在需要猜测它在哪里。
- 我们可将字符串作为参数传入程序,这样字符串
- Set-UID 程序的文件指针指向了
示例:覆盖函数指针:
int main(int argc, char **argv) { static char buf[16]; /* in BSS */ static int (*funcptr)(const char *str); /* in BSS */funcptr = (int (*)(const char *str))goodfunc;/* We can cause buffer overflow here */ strncpy(buf, argv[1], strlen(argv[1]));(void)(*funcptr)(argv[2]); return 0; } /* This is what funcptr would point to if we didn’t overflow it */ int goodfunc(const char *str) { ... ... }
- 函数指针(例如
int (*funcptr)(char *str)
)允许程序员动态修改被调用的函数。我们可以通过覆盖它的地址来覆盖函数指针,使之在执行时,它调用我们指向的函数。 argv[]
方式:将 Shellcode 储存在程序的参数中。这会使 Shellcode 储存在栈上。之后我们需要猜测它的地址(就像我们在栈溢出中那样)。这个方式需要可执行的栈。- 堆方式:将 Shellcode 储存在堆或 BSS 中(通过使用溢出)。之后我们需要猜测它的地址,并将估算的地址赋给函数指针。这个方式需要可执行的堆(比可执行的栈概率更大)。
- 函数指针(例如
- 函数指针
- 函数指针可以通过多种手段储存在堆或 BSS 中。这不需要由程序员定义。
- 如果程序调用了
atexit
,函数指针就会由atexit
储存在堆上,并且会在程序终止前调用。 svc/rpc
注册函数(librpc
,libnsl
以及其他)将回调函数储存在堆上。
- 其它示例
- BSDI
crontab
基于堆的溢出:长文件名的传递会溢出静态缓冲区。在内存中的缓冲区上面,我们拥有pwd
结构,它储存用户名、密码、UID、GID,以及其他。通过覆盖pwd
的 UID/GID 字段,我们可以修改权限,使crond
使用它执行我们的crontab
(只要他尝试执行我们的crontab
)。这个脚本之后可以产生 Suid Root Shell,因为我们的脚本会使用 UID/GID 0 来执行。
- BSDI
参考
- P. J. Salzman. Memory Layout And The Stack. In Book Using GNU’s GDB Debugger. URL: http://dirac.org/linux/gdb/02a-Memory_Layout_And_The_Stack.php.
雪城大学信息安全讲义 4.5相关推荐
- 雪城大学信息安全讲义 4.1~4.2
四.缓冲区溢出漏洞和攻击 原文:Buffer-Overflow Vulnerabilities and Attacks 译者:飞龙 1 内存 这个讲义的"区域"(Area)和&quo ...
- 雪城大学信息安全讲义 3.1 Set-UID 机制如何工作
三.Set-UID 特权程序 原文:Set-UID Programs and Vulnerabilities 译者:飞龙 这个讲义的主要目标就是来讨论特权程序,为什么需要他们,他们如何工作,以及它们有 ...
- 雪城大学信息安全讲义 3.3 提升 Set-UID 程序的安全性
3 提升 Set-UID 程序的安全性 exec函数 exec函数系列通过将当前进程映像包装为新的,来运行紫禁城.有许多exec函数的版本,工作方式不同.它们可以归类为: 使用/不适用 Shell 来 ...
- 雪城大学信息安全讲义 七、格式化字符串漏洞
七.格式化字符串漏洞 原文:Format String Vulnerability 译者:飞龙 printf ( user_input ); 上面的代码在 C 程序中十分常见.这一章中,我们会发现如果 ...
- 雪城大学信息安全讲义 六、输入校验
六.输入校验 原文:Input Validation 译者:飞龙 1 环境变量(隐藏的输入) 环境变量是隐藏的输入.它们存在并影响程序行为.在编程中忽略它们的存在可能导致安全隐患. PATH 在 Sh ...
- 雪城大学信息安全讲义 五、竞态条件
五.竞态条件 原文:Race Condition Vulnerability 译者:飞龙 1 竞态条件漏洞 下面的代码段属于某个特权程序(即 Set-UID 程序),它使用 Root 权限运行. 1: ...
- 雪城大学信息安全讲义 4.3~4.4
3 对抗措施 3.1 应用安全工程原则 使用强类型语言,例如 Java.C#,以及其他.使用这些语言,可以避免缓冲区溢出. 使用安全的库函数 可能拥有缓冲区溢出问题的函数:gets.strcpy.st ...
- 雪城大学信息安全讲义 3.2 Set-UID 程序的漏洞
2 Set-UID 程序的漏洞 2.1 隐藏的输入:环境变量 特权程序必须对所有输入进行安全检查.输入检查实际上是访问控制的一部分,特权程序必须这么做,来确保程序的安全.很多安全问题都是输入检查的错误 ...
- 雪城大学信息安全讲义 二、Unix 安全概览
二.Unix 安全概览 原文:Unix Security Basics 译者:飞龙 1 用户和用户组 用户 root:超极用户(UID = 0) daemon:处理网络. nobody:不拥有文件,用 ...
最新文章
- 15℃!人类首次实现高压下室温超导,研究登上Nature封面
- Spring Boot中验证码实现kaptcha
- 文件描述符在内核态下的一些小把戏
- idea社区版和企业版区别_IntelliJ IDEA 旗舰版与社区版有什么不同
- spark1.3.1使用基础教程
- iOS开发UI篇—模仿ipad版QQ空间登录界面
- 学术前沿 | Texar-PyTorch:在PyTorch里重现TensorFlow的最佳特性
- 计算机网络管理2018版,2018~2019学年度第二学期“计算机网络管理”专业技能竞赛火热进行中...
- Python:[-1]、[:-1]、[::-1]、[n::-1] 原理大详解(超全超仔细!)
- Tableau上面地图与条形图结合_Tableau | 20种常用图表(上文)
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单
- 初学FPGA一些建议
- 数据库 之 Mysql的表分区
- 高并发服务器逻辑处理瓶颈,如何解决?
- 【】论晚睡晚起的危害
- 苹果手机屏幕镜像_苹果手机还能一键投屏?点一下小屏变大屏幕,看剧是真畅快...
- 一个数根号3怎样用计算机计算,根号3等于多少怎么算
- matlab补帧,超清还不够,插帧算法让视频顺滑如丝丨NeurIPS 2019
- 股票指标接口合集 macd指标接口api kdj指标接口api,均线指标接口api,价格api
- Ruby On Rails 4 hello world,Ruby On Rails上手
热门文章
- 利用Vivado封装DCP文件基本流程
- 高中计算机课程打字网址,信息课
- AD学习笔记2021-5-29
- 单片机测量代码运行时间方法-STM32
- 关于Python ord()和chr()返回ASCII码和Unicode码的看法
- 查看mysql某人执行了什么语句_详解MySQL如何监控系统全部执行过的sql语句
- redhat升级linux内核,用rpm方式升级RHEL6.1内核
- 【Java数据结构与算法】第十一章 顺序存储二叉树、线索二叉树和堆
- Linux常用命令小结(一)
- 在死循环中使用Scanner获得键盘输入