首页 > 其他分享 >2022 漏洞分析期末试题详解

2022 漏洞分析期末试题详解

时间:2023-03-14 14:47:40浏览次数:39  
标签:返回 试题 libc ret 地址 详解 2022 环境变量 SHC

环境准备

关闭地址随机化

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-20230314141759560

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

image-20230314141827741

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

image

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

image

image

标签:返回,试题,libc,ret,地址,详解,2022,环境变量,SHC
From: https://www.cnblogs.com/sarfish/p/17214839.html

相关文章

  • 面试题整理
    1.为什么联合索引是最左匹配原则?2.为什么要分库分表?3.Sharding-jdbc集成流程?4.jvm双亲委派机制?5.微服务技术栈有哪一些?6.sql优化流程是怎么样的?explain作用?7.SpringB......
  • iso9001质量体系认证费用详解
    iso9001质量体系认证费用详解现在很多公司都会进行ISO9001质量管理体系认证,ISO9001认证对企业来说是非常重要的,ISO9001质量管理体系认证与企业的未来发展有关,而且会关系到......
  • Tarjan算法详解
    Tarjan算法介绍TarjanTarjan算法是用于在有向图中求强连通分量的算法这里给出强连通分量的定义:有向图中一个最大的图,使这个图中每个两点都能够互相到达。这个最大的图称......
  • K8S部署应用详解
    #前言首先以SpringBoot应用为例介绍一下k8s的发布步骤。1.从代码仓库下载代码,比如GitLab;2.接着是进行打包,比如使用Maven;3.编写Dockerfile文件,把步骤2产生的包制作成镜像......
  • dirsearch web网站目录扫描工具详解
    文章目录​​1dirsearch介绍​​​​2安装​​​​3实战演练​​​​3.1仅指定网址-u​​​​3.2指定网站语言-e​​​​3.3指定字典-w​​​​3.4递归目录-r​......
  • Python的namedtuple使用详解
    namedtuple又名具名元组,因为普通元组的局限性,不能为元组的数据进行命名,所以我们并不知道一个元组所要表达的意义,所以在这里引入了collections.namedtuple这个工厂函数,来构......
  • 转:numpy中expand_dims()函数详解
    注:本文只是本人的通俗理解,有些专业概念表达不是很清楚,但我相信你读完可以理解该函数并会使用。expand_dims(a,axis)中,a为numpy数组,axis为需添加维度的轴,a.shape将在该轴......
  • trycatchfinally执⾏顺序⾯试题总结
    trycatchfinally执⾏顺序⾯试题总结https://wenku.baidu.com/view/ea7200315c0e7cd184254b35eefdc8d376ee14d8.html?wkts=1678703969456&bdQuery=try+catch+finally+%E9%9......
  • 【MySQL】substring_index 函数详解
    【MySQL】substring_index函数详解命令格式stringsubstring_index(string<str>,string<separator>,int<count>)命令说明截取字符串str第count个分隔符之前的字......
  • 2023-03-13 递归详解
    1.递归基础和递归的宏观语意本质上,将原来的问题,转化为更小的同一问题举例代码publicclassArrSum{privateintres=0;publicintsum(int[]arr){......