GUETSEC

1. GUETSEC栈溢出(32位)

可以看到它看起来好像有四个栈溢出,我们逐个点进去




__isoc99_scanf("%20s", v1):限制了读取20个字符串(但其实无法完全杜绝缓冲区溢出风险)
0x50=80,对于second attack是溢出了,final chance却没有。
所以其实只有second attack存在栈溢出。
我们再看一下,有个gift函数,里面有system函数

再搜索一下,发现有个/bin/sh


那么一切就好办了,对second进行栈溢出之后将程序调转到system,并且要先输入first attack的值

这里的system的地址是plt,p32(0)填入的是返回地址,因为不需要了可以随便输,p32(binsh)是system的参数

这里的system是call system的地址,再给一个参数binsh即可。

2.GUETSEC整数溢出(64位)

可以看到它要我们输入一个size_t类型的nbyte,如果它转换为char类型之后不超过15,就会执行read函数。
read函数要读入转换为unsigned int类型的nbyte给大小为44的数组buf。
如果我们要拿到权限,那么我们得输入一个数,使其转换为char类型的时候大小小于等于15,但转换为unsigned int类型的时候大小超过44,就会发生栈溢出漏洞。
按shift+f12搜索一下

发现分别有system函数和/bin/sh

/bin/sh的地址为0x0404050

system的地址为0x0401090
因为是64位,要考虑一个栈对齐,需要找一个ret的地址。
函数传参,还要找寄存器rdi的地址

一切准备就绪,我们开始分析该输入什么样的nbyte
已知条件是这个数作为 size_t 类型时,其对应的 unsigned int 值(这里强调对应的意思是在字节数相同情况下二者在数值表示上的等同,比如都是 32 位无符号数表示的那个数值概念)大于 44,而转换为 char 类型后小于 15。
对于 char 类型小于 15 这一条件(这里同样假设 char 为无符号情况,一般在这样单纯讨论类型转换数值关系场景下无符号更便于分析理解),意味着该数的低 8 位二进制所对应的十进制数值要小于 15。例如,假设在 32 位环境下(此时 size_t 占 4 个字节,和 unsigned int 一样是 32 位表示),我们可以取数 260 (用十六进制表示为 0x00000104),它的二进制表示为 00000000 00000000 00000001 00000100,当把这个 size_t 类型的 260 转换为 char 类型时,只取低 8 位 00000100,转换为十进制就是 4,显然 4 小于 15;同时 260 作为一个无符号整数是大于 44 的,满足题目给定的条件。
其实满足条件的数有很多,只要这个 size_t 类型的数在其低 8 位二进制所对应的十进制数小于 15,且该数作为无符号整数(对应 unsigned int 概念上)大于 44 即可。如还有516等等
我们编写exp如下

3.GUETSECret2libc
image

posted @   fdddddd  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示