CTF mips总结

前言

感觉自己就是把几个mips的题给汇总了一下,算不上是总结吧。不过还是很有收获的。

题目一

DDCTF-babymips
拿到题目,分析是mips小端序,利用qemu模拟运行,注意要使用小端序(qemu也区分了大端小端)。然后输入了16个字符,结果出现段错误。23333
然后我就放弃了。
https://www.codetd.com/article/67983
https://cloud.tencent.com/developer/news/196131
参考这两篇文章我又复现了一遍。
qemu动态调试,我也没有成功2333.所以感觉自己分析不出这是花指令。
好吧,假如看出了是花指令,然后使用idc或者python去除之后。得到patch后的程序,使用ida反编译。
同样的搜索字符串定位到sub_400420函数,从后往前看,可以看到这么个流程图
CTF mips总结_第1张图片
数了一下,有16条判断,正确的流程应该是从右边过来。猜测这就是要对我们输入的16个数进行判断了。随便找一个判断看看。
CTF mips总结_第2张图片
233333.根本看不懂丫这些数据都是动态分配的吧。F5又无效,没办法了。
反编译mips指令有两种办法Retdec,和jeb2-mips。我两种方法都是了一遍。emmm,感觉还是Retdec好用。jeb其实很好,但是demo版的功能受限了。。。老是莫名其妙的退出???蒙蔽。
CTF mips总结_第3张图片
求个jeb2.3mips的破解版。。。
使用Retdec反编译后,定位到sub_400420函数,查看逻辑
CTF mips总结_第4张图片
后面也是同样,是16个方程组,也就是说我们只需要解出这个方程组就可以了。不过把这些数据抠出来也是个麻烦事!!!23333.得亏之前学了一波matlab。解线性方程组,用matlab或者python都是可以解决的。
抠数据抠的累的。233333….
另外看了pandaos师傅的wp,发现可以angr解决。代码如下:

# -*- coding:utf-8 -*-
from angr import *
import logging
import IPython
logging.getLogger('angr.manager').setLevel(logging.DEBUG)
p = Project('baby_mips')
state = p.factory.blank_state(addr=0x400420)
DATA_ADDR = 0xA0000
state.regs.a0 = DATA_ADDR
for i in range(16*4):
    vec = state.solver.BVS("c{}".format(i),8,explicit_name=True)
    cond = state.solver.And(vec>=32,vec<=126) # low byte
    state.memory.store(DATA_ADDR+i,vec)
    if i % 4 == 0:
        pass
    #state.add_constraints(cond)
sm = p.factory.simulation_manager(state)
res = sm.explore(find=0x40321c,avoid=[0x403210,0x403078,0x402EDC,0x402D44,0x402BAC,0x402A14,0x402878,0x4026DC,0x402544,0x4023AC,0x402214,0x40207C,0x401EE0,0x401D44,0x401BA8,0x401A10,0x403710])
# 这些地址不不同?人的bin会不不?一样。
found = res.found[0]
mem = found.memory.load(DATA_ADDR,16*4)
print found.solver.eval(mem)
print '##########################################'
flag = ''
for i in range(16):
    v = found.memory.load(DATA_ADDR + 4*i,1)
    flag = flag + found.solver.eval(v,cast_to=str)
print flag  #193e9499db7603e6

CTF mips总结_第5张图片

CTF mips总结_第6张图片

题目二

西湖论剑个人赛 iot 5ad94a626c884
CTF mips总结_第7张图片
比较的蛋疼,运行不了。。但是呢,这题还是比较简单的。ida查看。
CTF mips总结_第8张图片
还是比较清楚的吧,flag长度为0x20
CTF mips总结_第9张图片
定位到关键函数sub_400790,IDA进去之后发现有点乱,因此使用retdec在线反编译。主办方提示说是base64,但是没找到base64的table啊!
***ps.retdec可以在线反编译也可以使用它提供的api在ida内进行反编译***dd

但是这题有非预期解,不知道怎么回事,将文件直接转化为base64即可看到flag,这里不多探究了。

题目三

2018国赛 2ex
当我做到这题的时候已经没什么时间去分析了,而且mips的题我也确实是不会。
首先肯定要先测试一下程序。
CTF mips总结_第10张图片
输出长度为24,但是out的长度为26.。而且可以看到输出了==,再试一下其他输入
CTF mips总结_第11张图片
我觉得看到这些变化一定会有感觉的,猜测是base64,base64的话关键在于寻找table。搜寻一下可疑的字符串。
这里写图片描述
然后手工算了一下,确实是这个table。有了table,那么写个解base64的脚本就行了。
代码如下:

# -*- coding:utf-8 -*-
decode="_r-+_Cl5;vgq_pdme7#7eC0="
table='''@,.1fgvw#`/2ehux$~\"3dity%_;4cjsz^+{5bkrA&=}6alqB*-[70mpC()]8'''
x="".join(map(lambda x:bin(table.index(x))[2:].zfill(6),decode))
res=[]
for i in range((len(x))/8):
    res.append(chr(eval('0b'+x[i*8:(i+1)*8])))
print "".join(res)  #flag{change53233}

总结

最近一阵子挺忙的。这篇文章历时4天终于写完,期间还经历了两门期中考试,一科联考。呵.呵呵.呵呵呵.希望下次在遇到mips的程序可以多少提供点思路。
target:study angr

你可能感兴趣的:(CTF,Re)