[re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp

[re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp

这道题是2020网鼎杯青龙组的一道逆向提signal,一道虚拟机逆向题目,题目本身不难,可以直接分析也可以符号执行秒掉。

题目分析

正常windows逆向,开局直接输flag,也不多bibi:
在这里插入图片描述
逆向分析程序:
[re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp_第1张图片
程序开始将全局变量区的opcode作为参数给vm_operad函数,看名字也能看出是一个虚拟机分析的题目,先把opcode提取出来:

\x0A \x04 \x10 \x08 \x03 \x05 \x01 \x04 \x20 \x08 \x05 \x03 \x01 \x03 \x02 \x08 
\x0B \x01 \x0C \x08 \x04 \x04 \x01 \x05 \x03 \x08 \x03 \x21 \x01 \x0B \x08 \x0B 
\x01 \x04 \x09 \x08 \x03 \x20 \x01 \x02 \x51 \x08 \x04 \x24 \x01 \x0C \x08 \x0B 
\x01 \x05 \x02 \x08 \x02 \x25 \x01 \x02 \x36 \x08 \x04 \x41 \x01 \x02 \x20 \x08 
\x05 \x01 \x01 \x05 \x03 \x08 \x02 \x25 \x01 \x04 \x09 \x08 \x03 \x20 \x01 \x02 
\x41 \x08 \x0C \x01 \x07 \x22 \x07 \x3F \x07 \x34 \x07 \x32 \x07 \x72 \x07 \x33 
\x07 \x18 \x07 \xA7 \x07 \x31 \x07 \xF1 \x07 \x28 \x07 \x84 \x07 \xC1 \x07 \x1E 
\x07 \x7A

然后查看行为,顺便给变量改个名:
[re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp_第2张图片
一般vm的题目就是一个大的switch,根据分析把操作整理出来,有的操作,如加法,需要一个立即数参与,然后数组下标有好几个变量,我这里通用i表示了(实际做题不用这么细致。。):

01    :result[i]=temp
02 imm:temp=input[i]+imm
03 imm:temp=input[i]-imm
04 imm:temp=input[i]^imm
05 imm:temp=input[i]*imm
06    :i++
07 imm:result[i]==imm
08    :imput[i]=temp
0A    :input 输入字符串
0B    :temp=input[i]--
0C    :temp=input[i]++

可以看到opcode最后也是一堆0x7,说明是最后校验flag.

手动解题

flag不长可以直接手动恢复:

input[0]^0x10-0x05=0x22    input[0]='7'
input[1]^0x20*0x03=0x3f    input[1]='5'
input[2]-0x02-0x01=0x34    input[2]='7'
input[3]+1^0x04=0x32       input[3]='5'
input[4]*3-0x21=0x72       input[4]='1'
input[5]-2=0x33            input[5]='5'
input[6]^0x09-0x20=0x18    input[6]='1'
input[7]+0x51^0x24=0xA7    input[7]='2'
input[8]=0x31              input[8]='1'
input[9]*2+0x25=0xf1       input[9]='f'
input[10]+0x36^0x41=0x28   input[10]='3'
input[11]+0x20=0x84        input[11]='d'
input[12]*3+0x25=0xC1      input[12]='4'
input[13]^0x09-0x20=0x1E   input[13]='7'
input[14]+0x42=0x7A        input[14]='8'

所以最后flag是:flag{757515121f3d478}
在这里插入图片描述

符号执行自动秒题

队里师傅是用angr直接跑的,这种题目确实可以用符号执行约束求解来解答。这里使用angr来进行符号执行。

我比较懒,需要用到啥新环境第一个想到的肯定是docker(自己配环境是万万不可能的),于是找了一下,有angr的docker:

附上dockerhub链接:https://hub.docker.com/r/angr/angr

docker pull angr/angr
docker run -it -v /mnt/hgfs/share:/mnt/ angr/angr
#/mnt/hgfs/share 目录是我题目所在的目录,直接挂载在docker里的/tmp目录

然后进入docker 后,在/mnt/目录下就是你的代码和程序。

这道题根本不用什么angr的高端操作,直接一把梭即可:

import angr

p = angr.Project('./signal.exe')   #指定angr跑的程序
state = p.factory.entry_state()    #新建一个SimState的对象,得到一个初始化到二进制入口函数的SimState对象。
simgr = p.factory.simgr(state)   #创建simulation manager,angr的主要入口

simgr.explore(find=0x004017A5 ,avoid=0x004016E6)  #争取跑到输出成功的地址,避免跑到输出wrong的地址
flag = simgr.found[0].posix.dumps(0)[:15]     #得到flag
print(flag)

一把梭跑出flag:
[re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp_第3张图片
这道题比较简单甚至不用约束直接求解即可,更多关于angr的进阶知识可以看先知社区的“深入浅出angr”系列

https://xz.aliyun.com/t/3990

你可能感兴趣的:(ctf,#,ctf-re,#,逆向,逆向工程,ctf,安全,符号执行,二进制安全)