攻防世界pwn题:forgot
0x00:查看文件信息
该文件是32位的,canary和PIE保护机制没开。
0x01:用IDA进行静态分析
总览:
该函数就是:v5初值为1,对v2输入一串字符。然后执行一个会根据输入的字符串而修改v5的循环语句,最后调用相应的函数。
同时,发现文件里面已经含有cat flag的函数:
函数snprintf介绍:
printf("cat %s", "./flag")是将cat ./flag输出到屏幕上。
snprintf(s, 0x32, "cat %s", "./flag")是最多将后面的字符串("cat ./flag")输入0x32个到变量s上。
所以,我们要想办法去执行这个cat_flag函数。现在我们已知的漏洞点是scanf对v2输出存在溢出。再根据程序的第3行到第8行中变量的声明可了解到v2可以溢出覆盖数组v3、数组s、变量v5甚至是所在栈帧的返回地址。
一个常规的解法是覆盖v3[0]为cat_flag函数的地址值,然后进一步想办法使执行循环后,v5的值为1。这样在最后就会调用v3[--1]指向的函数,即get_flag函数。
v5的初值为1,所以在switch中为case 1。其条件判断为:
因为v5本来就是1,所以我们只要保持不变就好了,即return false。根据短路原理,只要字符串均为A(ascii=65 < 96)就行了。
0x02:编写exp
from pwn import *
context(os='linux', arch='i386', log_level='debug')
io = process("./forgot")
#io = gdb.debug("./forgot",'b *0x08048A5D')
#io = remote("111.200.241.244",58065) get_flag = 0x080486CC
payload = b'A'*0x20 + p32(get_flag) io.sendline("tolele")
io.recv()
io.sendline(payload)
io.recv()
io.interactive()
可以成功cat到flag。
0x03:回顾再分析
因为v2定义的数组大小是32个元素,所以我们还需要考虑的问题是:
- 当对v2进行溢出式的赋值后,strlen(v2)会等于多少呢?
- 如果strlen(v2)的值大于或等于32,程序中对数组v2的访问岂不是越界了么?
解决问题:
我们可以对strlen函数的源代码进行分析:
strlen.c source code [glibc/string/strlen.c] - Woboq Code Browser
对该源代码分析的博客:
c语言库函数strlen源码实现_风雨也从容的博客-CSDN博客_c语言strlen源代码
简而言之,strlen(const char* str)的返回值就是,从首字节开始从1往上计数,到'\x00'停止,且不算入'\x00'。
(注:以下内容仅是个人想法,请保留质疑!)
既然这样,那么payload = b'A'*0x20 + p32(get_flag)岂不是会远远大于32(数组v3中均没有出现'\x00'字节),这样对数组的访问不会报错吗?
其实,我们平时遇到的数组访问越界是由于在集成开发环境(vs,vc…)中会进行检测。但实际上源代码中是没有检测机制的,linux中就是直接对动态库进行链接,相当于是直接使用了源代码。所以,在linux上并不会出现报错。
同样,数组索引的本质实现是基于汇编语言,相当于就是*(v2+i)。在linux中并不会进行越界检测。
实验一下:
我们对c2进行字符串输入后,会自动在字符串末尾添加个'\x00'。即上面实验中c3[14]被赋值了'\x00'。同时,由于get_flag = 0x080486CC,ascii码值均小于96,所以v5不会被改变。
所以,问题也就差不多解决了。
0x04:其他思路的分析
其实在最开始时,我们如果看到了栈溢出和get_flag函数。最先想到的就是直接栈溢出覆盖main函数栈帧的返回地址,结束时直接调用就好啦~
此时,payload = b'A'*0x78 + b'B'*0x4 + p32(get_flag)
(动态调试后发现是0x78,并不是ida中的0x74)
执行后发现pwn不通,动态调试一下:
得知,程序开在了0x08048a61这一步。这不卡住才怪,用eax*4来进行偏移,而eax为0x44444443('CDDD')。
在ida中继续对eax值的来源进行调查:
对该处按F5查看反汇编代码,发现((void (*)(void))v3[--v5])(); 这里的。上一步是将esp + 78h的值赋给了eax,esp + 78h对应的变量则是v5。由于我们直接覆盖到返回地址,所以图中也把v5给覆盖了,值还挺大的。早就超了最大空间,所以执行不下去了。
0x05:个人唠叨
以前在做题过程中遇到问题总喜欢逃避,毕竟这是“解决”问题最轻松的一种方式。在做这道题时,我硬逼着自己去思考能够解决问题的方法,以及动手去尝试。一步一步的去解决问题,虽然很慢,但知识学得很实。希望自己能够继续以这种方式面对各种困难。
最后再反省一下:在第一个思路pwn不通的时候,直接丢个代码和exp问群里的师傅为啥pwn不通?现在想想这样去提问还挺不好的,这将会浪费师傅们很多时间去确定问题所在。所以,以后问问题的话,尽量缩小出问题的范围,或者将问题转换为概念性的提问。
tolele
2022-06-05
攻防世界pwn题:forgot的更多相关文章
- 攻防世界pwn题:Recho
0x00:查看文件信息 一个64位二进制文件,canary和PIE保护机制没开. 0x01:用IDA进行静态分析 分析:主程序部分是一个while循环,判断条件是read返回值大于0则循环.函数ato ...
- 攻防世界pwn题:实时数据检测
0x00:查看文件 一个32位的文件,canary.NX.PIE保护机制均关闭. 0x01:用IDA进行静态分析 程序很简单,输入一串字符(个数限制:512),然后再输出.最后根据key变量进行条件语 ...
- 攻防世界PWN简单题 level0
攻防世界PWN简单题 level0 开始考验栈溢出的相关知识了 Checksec 一下文件 看看都开了什么保护 和 是多少位的程序 发现是64位的程序, 扔进IDA64.IDA YYDS.. 进入主函 ...
- 攻防世界PWN简单题 level2
攻防世界PWN简单题 level2 此题考验的是对ROP链攻击的基础 万事开头PWN第一步checksec 一下 32位的小端程序,扔进IDA 进入函数,找出栈溢出漏洞. 又是这个位置的栈溢出,rea ...
- 【pwn】攻防世界 pwn新手区wp
[pwn]攻防世界 pwn新手区wp 前言 这几天恶补pwn的各种知识点,然后看了看攻防世界的pwn新手区没有堆题(堆才刚刚开始看),所以就花了一晚上的时间把新手区的10题给写完了. 1.get_sh ...
- CTF--web 攻防世界web题 robots backup
攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...
- CTF--web 攻防世界web题 get_post
攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...
- 攻防世界pwn高手区——pwn1
攻防世界 -- pwn1 攻防世界的一道pwn题,也有一段时间没有做pwn了,找了一道栈题热身,发现还是有些生疏了. 题目流程 拖入IDA中,题目流程如图所示,当v0为1时,存在栈溢出漏洞.在gdb中 ...
- 攻防世界 robots题
来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...
随机推荐
- springMVC中获取request和response对象的几种方式(RequestContextHolder)
springMVC中获取request和response对象的几种方式 1.最简单方式:参数 2.加入监听器,然后在代码里面获取 原文链接:https://blog.csdn.net/weixin_4 ...
- vue构建项目步骤
1.node版本请更新到6.9.X版本以上,不然npm依赖会出问题 2.命令行里运行npm install --global vue-cli 3.npm install --global webpac ...
- FastAPI(七十一)实战开发《在线课程学习系统》接口开发-- 查看留言
之前FastAPI(七十)实战开发<在线课程学习系统>接口开发--留言功能开发分享了留言开发,这次我们分享查看留言 梳理这里的逻辑,这个接口要依赖登录. 1.判断用户是否登录 2.判断对应 ...
- Intel主板芯片组
写这个的初衷还是由于linux内核本身就是硬件的抽象,如果你对硬件的相关发展,机制以及架构不了解,实际你也是看不懂linux内核代码以及看不懂linux很多命令输出的结果的,如果你看内核代码就会发现内 ...
- Model, HttpServletRequest, ModelMap区别
看了spring mvc的底层会发现,model数据最终还是写到HttpServletRequest属性中,只是model的写法更体现了MVC思想减少各层间耦合 写法: 1.request.setAt ...
- 几种比较经典的波形及其FFT变换(正弦波,三角波,方波和锯齿波)
之前上学时我的信号学得最差了,主要原因还是我高数学得不怎么样.可能是人总敬畏自己最不会的,所以我觉得我学过诸多科目中,数学是最博大精深而最妙的,从最开始的一次函数到反比例函数,二次三次函数和双曲线,椭 ...
- 2021.12.06 P2511 [HAOI2008]木棍分割(动态规划)
2021.12.06 P2511 [HAOI2008]木棍分割(动态规划) https://www.luogu.com.cn/problem/P2511 题意: 有n根木棍, 第i根木棍的长度为 \( ...
- Python 交互式解释器的二三事
学 Python 不知道何时起成了一种风尚.这里,我也随便聊聊跟Python 的交互式解释器的几个有意思的小问题. 如何进入 Python 交互解释器? 当你安装好 Python 后,如何进入 Pyt ...
- 倒计时第3天!Google Summer of Code报名即将截止!(Casbin社区还有空缺名额)
Google Summer of Code 介绍 Google Summer of Code ( GSoC ,即 Google 编程之夏)是 Google (谷歌)组织并提供经费,面对全球在读学生的在 ...
- 今天学弟问我pip如何永久换源?
pip如何永久换源 临时使用 我们在使用Python开发的时候,经常要下载第三方模块,最常用的方式就是直接pip install 模块名,但是默认是使用国外的源,从pypi仓库中查找目标模块,不管是网 ...