QWB-xx_warmup_obf

首先恭喜BOI晋级强网杯决赛,多谢队伍里的大佬们在百忙之中抽出时间来打比赛,带小弟能够去线下见见世面。此次强网杯比赛逆向方向感觉题目难度分配的还是比较均匀的,强网先锋里的题目可以先找找自信,后面在逆向方向陆续出的题目也是由易到难不至于打的自闭。后面陆续会针对强网杯的每道题目做出详细分析,此篇先分析xx_warmup_obf。

动态调试该题可以看到会不断的出现int 3指令,推测应该里面应该加入反调试技术。

image-20200831201619445

继续跟下去发现就是一个死循环,eax不论怎样都不会等于0x24c1d7a3,因此调试的话是肯定执行不到输入判断处。大致看了下程序在init_array存在一个sub_400B4C信号量处理函数

image-20200831204311020

里面存在大量的赋值语句,估计该程序的反调试技术由于int 3指令执行导致不能触发信号量处理,解决的方法就是在判断语句处set寄存器的值为判断值就行(虽然很麻烦),根据信号量处理赋值语句的数量估计要改很多处判断,小编采取的是attach的方式改了不到5处判断就顺利进入到输入验证语句处。

image-20200831205307126

首先会验证你的输入长度是否为0x1C,然后就是解28组方程,方程的变量数目依次增加,但每组方程只会解出一个变量,我在做这个题目时也想过去花指令直接f5然后z3解,但后来发现不现实,花指令完全没规律而且量多,最后小编是一步一步手扣下来,扣了几个小时才扣完。但后来想了想其实可以采取爆破的方式一次爆四个变量,且不需要把28个方程全部扣下来。但这也是个蠢办法。赛后看了大佬的wp其实可以用angr指定路径分析。你的输入都放置在rax指向的内存空间处,所以可以对rax设置一个内存地址,利用claripy对该地址初始化向量。这里稍微修改了下大佬的exp,并做了些注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import angr
import claripy
p=angr.Project('./xx_warmup_obf',auto_load_libs=False)
state=p.factory.blank_state(addr=0x402d10)#指定入口
tmp_addr=0x20000#模拟一个内存地址用于存放输入
ans=claripy.BVS('ans',8*28)
state.memory.store(tmp_addr,ans)#往地址空间部署符号大小为8位长度为28的符号变量
state.regs.rax=0x20000#设置rax指向地址0x20000
sm=p.factory.simgr(state)

for byt in ans.chop(8):#把整个数据分割每8位为一组,并对每个数据大小作出限制
state.add_constraints(state.solver.And(byt>=ord(' '),byt<=ord('~')))
find=[0x408470]#最后一个方程的判断跳转地址
avoid=[0x402d2f,0x402f96,0x4032c5,0x4034b6,0x4035cf,0x403728,0x4039d4,0x403b27,0x403cb9,0x403e34,0x40418f,0x40459c,0x4048fe,0x404c6d,0x405051,0x405286,0x405594,0x4057ef,0x405b96,0x406057,0x406537,0x406931,0x406da9,0x407069,0x407606,0x40790b,0x407d8f,0x4081b4]#方程最后判断语句的下一个语句的地址
print (len(avoid))

sm.explore(find=find,avoid=avoid)
if sm.found:
solution_state=sm.found[0]
solution=solution_state.se.eval(ans,cast_to=bytes)
print (solution)

输出结果

image-20200831214958257

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2022 llx-moon
  • Visitors: | Views:

请我喝杯咖啡吧~