2022 漏洞分析期末试题题解

环境准备

关闭地址随机化

image

sudo chown root ...sudo chmod 4755 ...q1~q5 设置特权

image

q1题解

题面:

image

short类型最大值为65535,input的长度高于该值即可造成整数溢出绕过 if(len < MAX_LEN) 检查。

基本思路:利用缓冲区溢出覆盖 foo 栈帧返回地址以导向环境变量中的 shellcode ,从而获取特权。

解题过程

设置环境变量 SHC 存放 shellcode

export SHC=$(python -c "print '\x90'*1000 + '\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80'")

image

编写查看 SHC 地址的程序,SHC 的地址为 0xbffffa5a

image

gdb 调试 q1

foo的返回地址为 0x08048531

image

copy结束后的命令处打断点以观察栈帧数据

image

计算得返回地址保存在 0xbfffef28 + 4 = 0xbfffef2c

image

buffer起始处为 0xbfffee10 + 3*4 + 2 = 0xbfffee1e

image

计算得到buffer和返回地址相距270字节

image

构造输入将返回地址处覆盖为SHC地址即可成功获取特权。

image

q2题解

题面:

image

strncpy确保了不会发生缓冲区溢出,无法通过该手段覆盖返回地址。但printf(buf)提供了可利用的格式化字符串漏洞。

要把返回地址覆盖,就要修改跳转表中的地址为shellcode的地址,且使程序调用对应的函数。题面中,可利用的exit函数要flag=500时才会调用到,于是利用字符串漏洞修改flag的值。

为什么不直接利用 %n 修改返回地址?因为gdb调试时的地址和实际运行地址有差别,但相对位置、全局变量的地址和跳转表中的地址是不变的。

解题过程

  1. 修改flag

注意这两个函数调用

image

第二次printf调用时,第一次调用使用的&flag仍在栈中,它是该次调用的第一个可变参数。

image

成功修改flag=500

image

  1. 修改跳转表

objdump -R q2 查得 exit 的表项在 0x0804a010 处。

image

存储shellcode的环境变量 SHC 位于 0xbffffa5a 处,将 exit 表项值修改为 0xbffffa5a 即可。

用以下方法测算得buf的第一个双字和第二个双字分别对应printf第11和12个可变参数。

image

将表项的高半节地址和低半字地址存放在字符串首8字节中,构造输出字符数为0xbfff0xfa5a写入,就完成了对表项的覆写。

$'\x12\xa0\x04\x08\x10\xa0\x04\x08'%492x%1\$n%48651x%11\$hn%14939x%12\$hn

成功。

image

q5题解

题面:

image

仍然是return-to-libc,但是memset(environ[i], '\0', strlen(environ[i])) 应该是把环境变量清掉了,因此无法把参数通过环境变量传入。但是func中的缓冲区溢出使得我们可以将参数放在栈上。

解题过程

gdb一下,查看q5的func函数的栈帧,不难发现bok起始处距离返回地址有10个双字。

image

需要特别注意的是bok后保存的是blah的值,即字符串指针。该处要覆盖为其本来的值以免从错误的地址拷贝数据。

攻击字符串构造思路如下:

image

进入gdb运行一下q5,查询system和exit的地址:

image

构造攻击字符串,完成提权。

image

q3题解

题面:

image

提示用return-to-libc做,但是指定了需要进行的操作,要完成4次libc函数调用。该题没有清环境变量,因此参数可以放在环境变量中。

一般的思路仍是覆盖返回地址以指向一些libc函数,并将参数放在栈上。但该题有多次调用,因此需要在内存代码区寻找一些可用的指令序列(例如pop ret)以将上次函数调用的参数出栈然后ret到下一个调用的入口。

解题过程

首先创建环境变量并获取地址

image

向badfile写入AAAA后调试q3查看bof栈帧

image

查看libc函数地址:

image

然后我们需要在内存代码区寻找一些可用的pop ret序列。main函数和bof函数末尾都是leave; ret;,虽然leave也有出栈操作,但是它会顺带移动esp。于是我们在libc函数中寻找可用的指令。

system中,末尾指令为add 0x1c, esp; ret,可用。

image

strlen中,末尾指令为pop ebx; ret,可用。

image

由上,我们可以构造输入使得栈帧数据如下所示:

image

用python生成恶意输入保存到文件,启动q3,成功获取到特权。

image

image

posted @   Sarfish  阅读(407)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示