羊城杯2021-EasyVM

阅读量    386238 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

1.初次分析

IDA打开:

看到这种情况,大致可以确实代码会在运行的自修改。
代码自修改函数

这里大致有2种方法来得到解密后的代码,一个是动态运行后dump下来,一个是根据自修改函数写idapython来修改,我这里选择的是dump(懒狗是这样的)。

 

2.动态调试dump代码

未修改前:

修改后:

可以看到第一个机器码从0x86变为0x55,而0x55的汇编是push ebp。
通过IDA分析此函数的地址范围是0x80487A8~0x8048F44。
输入命令dump memory 保存路径 0x80487a8 0x8048f44dump下代码。

 

3.分析dump代码

利用idapython修改分析机器码
修改前

修改后

可以看到虚拟机的op_code的对应操作。

 

4.虚拟机分析

虚拟机初始化

为了后面更好的分析虚拟机的操作,这里定义一些寄存器。
v1[1]:rax; v1[2]:rbx; v1[3]:rdx; v1[4]:rex; v1[5]:rfx; v1[9]:rcx;

首先确定运行时会用到的指令,利用IDApython。这里代码贴一部分。

然后根据指令来分析相应的汇编。(no表示不会用到)

洗出汇编代码

part1(input[0x0~0x1f])

read input
mov rax,input[0x0]
mov rcx,0x7B
xor rax,rcx
cmp 0x4a,rax
mov rax,input[0x1]
mov rcx,0x2F
xor rax,rcx
cmp 0x19,rax
mov rax,input[0x2]
mov rcx,0xE8
xor rax,rcx
cmp 0xdd,rax
mov rax,input[0x3]
mov rcx,0x37
xor rax,rcx
cmp 0xf,rax
mov rax,input[0x4]
mov rcx,0x2F
xor rax,rcx
cmp 0x1b,rax
mov rax,input[0x5]
mov rcx,0xE8
xor rax,rcx
cmp 0x89,rax
mov rax,input[0x6]
mov rcx,0x7B
xor rax,rcx
cmp 0x19,rax
mov rax,input[0x7]
mov rcx,0x37
xor rax,rcx
cmp 0x54,rax
mov rax,input[0x8]
mov rcx,0x7B
xor rax,rcx
cmp 0x4f,rax
mov rax,input[0x9]
mov rcx,0x7B
xor rax,rcx
cmp 0x4e,rax
mov rax,input[0xa]
mov rcx,0x37
xor rax,rcx
cmp 0x55,rax
mov rax,input[0xb]
mov rcx,0x37
xor rax,rcx
cmp 0x56,rax
mov rax,input[0xc]
mov rcx,0xE8
xor rax,rcx
cmp 0x8e,rax
mov rax,input[0xd]
mov rcx,0x2F
xor rax,rcx
cmp 0x49,rax
mov rax,input[0xe]
mov rcx,0x37
xor rax,rcx
cmp 0xe,rax
mov rax,input[0xf]
mov rcx,0x7B
xor rax,rcx
cmp 0x4b,rax
mov rax,input[0x10]
mov rcx,0x37
xor rax,rcx
cmp 0x6,rax
mov rax,input[0x11]
mov rcx,0x37
xor rax,rcx
cmp 0x54,rax
mov rax,input[0x12]
mov rcx,0x2F
xor rax,rcx
cmp 0x1a,rax
mov rax,input[0x13]
mov rcx,0x7B
xor rax,rcx
cmp 0x42,rax
mov rax,input[0x14]
mov rcx,0x37
xor rax,rcx
cmp 0x53,rax
mov rax,input[0x15]
mov rcx,0x7B
xor rax,rcx
cmp 0x1f,rax
mov rax,input[0x16]
mov rcx,0x37
xor rax,rcx
cmp 0x52,rax
mov rax,input[0x17]
mov rcx,0xE8
xor rax,rcx
cmp 0xdb,rax
mov rax,input[0x18]
mov rcx,0x7B
xor rax,rcx
cmp 0x19,rax
mov rax,input[0x19]
mov rcx,0xE8
xor rax,rcx
cmp 0xd9,rax
mov rax,input[0x1a]
mov rcx,0x7B
xor rax,rcx
cmp 0x19,rax
mov rax,input[0x1b]
mov rcx,0x37
xor rax,rcx
cmp 0x55,rax
mov rax,input[0x1c]
mov rcx,0x2F
xor rax,rcx
cmp 0x19,rax
mov rax,input[0x1d]
mov rcx,0x37
xor rax,rcx
cmp 0x0,rax
mov rax,input[0x1e]
mov rcx,0x7B
xor rax,rcx
cmp 0x4b,rax
mov rax,input[0x1f]
mov rcx,0x2F
xor rax,rcx
cmp 0x1e,rax

part2(input[0x20~0x23])

mov rax,input[0x20]
mov rbx,0x18
shl rax,rbx
mov rcx,rax
mov rax,input[0x21]
mov rbx,0x10
shl rax,rbx
add rcx,rax
mov rax,input[0x22]
mov rbx,0x8
shl rax,rbx
add rcx,rax
mov rax,input[0x23]
add rcx,rax
mov rax,rcx
mov rbx,0x5
shr rax,rbx
xor rax,rcx
mov rcx,rax
mov rbx,0x7
shl rax,rbx
mov rbx,0x98f17723
and rax,rbx
xor rax,rcx
mov rcx,rax
mov rbx,0x18
shl rax,rbx
mov rbx,0x35e4b920
and rax,rbx
xor rax,rcx
mov rcx,rax
mov rbx,0x12
shr rax,rbx
xor rax,rcx
cmp rax,0x6febf967

part3(input[0x24~0x27],input[0x28~0x2b])

mov rax,input[0x24]
mov rbx,0x18
shl rax,rbx
mov rcx,rax
mov rax,input[0x25]
mov rbx,0x10
shl rax,rbx
add rcx,rax
mov rax,input[0x26]
mov rbx,0x8
shl rax,rbx
add rcx,rax
mov rax,input[0x27]
add rcx,rax
mov rax,rcx
mov rdx,0x20
mul rax,rdx
mov rex,rax
xor rax,rcx
mov rbx,0x11
shr rax,rbx
mov rfx,rax
mov rax,rfx
xor rax,rex
xor rax,rcx
mov rbx,0xd
shl rax,rbx
xor rax,rcx
xor rax,rex
xor rax,rfx
mov rcx,rax
mov rdx,0x20
mul rax,rdx
mov rex,rax
xor rax,rcx
mov rbx,0x11
shr rax,rbx
mov rfx,rax
mov rax,rfx
xor rax,rex
xor rax,rcx
mov rbx,0xd
shl rax,rbx
xor rax,rcx
xor rax,rex
xor rax,rfx
cmp 0xCF1304DC,rax
mov rax,input[0x28]
mov rbx,0x18
shl rax,rbx
mov rcx,rax
mov rax,input[0x29]
mov rbx,0x10
shl rax,rbx
add rcx,rax
mov rax,input[0x2a]
mov rbx,0x8
shl rax,rbx
add rcx,rax
mov rax,input[0x2b]
add rcx,rax
mov rax,rcx
mov rdx,0x20
mul rax,rdx
mov rex,rax
xor rax,rcx
mov rbx,0x11
shr rax,rbx
mov rfx,rax
mov rax,rfx
xor rax,rex
xor rax,rcx
mov rbx,0xd
shl rax,rbx
xor rax,rcx
xor rax,rex
xor rax,rfx
mov rcx,rax
mov rdx,0x20
mul rax,rdx
mov rex,rax
xor rax,rcx
mov rbx,0x11
shr rax,rbx
mov rfx,rax
mov rax,rfx
xor rax,rex
xor rax,rcx
mov rbx,0xd
shl rax,rbx
xor rax,rcx
xor rax,rex
xor rax,rfx
cmp 0x283B8E84,rax
end

把汇编翻译成高级语言

根据翻译出的代码来逆出正确输入。
input[0x0~0x1f]简单异或一下可以得到结果。
input[0x20~0x23]

input[0x24~0x27]
此处的逻辑为:
b^(b<<0xd)=cmp_data

a^(a>>0x11)=b

input^(input<<0x5)=a
利用python的z3求解来解决

最后求出字符串为:16584abc45baff901c59dde3b1bb6701a254b06cdc23

第一次连续花12个小时来做一道题,又苦又快乐了属于是。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多