当前位置: 首页 > news >正文

[GWCTF 2019]babyvm

第一次接触VM逆向

先粘一下对我很有帮助的两篇佬的博客

系统学习vm虚拟机逆向_vmp 虚拟机代码逆向-CSDN博客

这篇去学习vm逆向到底是什么

我的浅显理解啊,就是和汇编的定义差不多,规定一个函数,用什么其他的名字

然后这道题

[GWCTF 2019]babyvm 详解 (vm逆向 IDA结构体)-CSDN博客

这个哥写的就真棒

还学会了struct

__________________________________

进入IDA

sp报错

打开

alt+k

改为-8

F5回来就不报错了

main

进入main函数

中间三个函数,一次点进去看一下

CD1

创建结构体 

 

来到struct创建结构体

方便我们看(这一步可跳过)

我是基本上参考的上面的

func有两个变量因为一个是代号,一个是函数

对着_int64改好就这样

确实方便得多

但是我不知道为什么我改不了全局

B5F

这是?

mov操作!

把数据放入寄存器的啦

A64

看不懂捏(才怪)

_____其实就是 xor eax ,ebx

然后++就是运行指针下一步

AC5

判断长度是否为21

956

啥也不是,下一位!

A08

mul,乘法

8F0

大一的时候,我写c语言作业也是这样swap的()

99c

a=c+2b+3a

这样的操作

分析解释了

现在去拿opcode

0xF5, 0xF1, 0xE1, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,

0x20, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x01, 0x00, 0x00, 0x00,

0xF2, 0xF1, 0xE4, 0x21, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x02,

0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x22, 0x00, 0x00, 0x00,

0xF1, 0xE1, 0x03, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x23,

0x00, 0x00, 0x00, 0xF1, 0xE1, 0x04, 0x00, 0x00, 0x00, 0xF2,

0xF1, 0xE4, 0x24, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x05, 0x00,

0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x25, 0x00, 0x00, 0x00, 0xF1,

0xE1, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x26, 0x00,

0x00, 0x00, 0xF1, 0xE1, 0x07, 0x00, 0x00, 0x00, 0xF2, 0xF1,

0xE4, 0x27, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x08, 0x00, 0x00,

0x00, 0xF2, 0xF1, 0xE4, 0x28, 0x00, 0x00, 0x00, 0xF1, 0xE1,

0x09, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x29, 0x00, 0x00,

0x00, 0xF1, 0xE1, 0x0A, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,

0x2A, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0B, 0x00, 0x00, 0x00,

0xF2, 0xF1, 0xE4, 0x2B, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0C,

0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2C, 0x00, 0x00, 0x00,

0xF1, 0xE1, 0x0D, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2D,

0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00, 0xF2,

0xF1, 0xE4, 0x2E, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0F, 0x00,

0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2F, 0x00, 0x00, 0x00, 0xF1,

0xE1, 0x10, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x30, 0x00,

0x00, 0x00, 0xF1, 0xE1, 0x11, 0x00, 0x00, 0x00, 0xF2, 0xF1,

0xE4, 0x31, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x12, 0x00, 0x00,

0x00, 0xF2, 0xF1, 0xE4, 0x32, 0x00, 0x00, 0x00, 0xF1, 0xE1,

0x13, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x33, 0x00, 0x00,

0x00, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xF1,

0xE1, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x01, 0x00, 0x00,

0x00, 0xF2, 0xF1, 0xE4, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE1,

0x01, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x02, 0x00, 0x00, 0x00,

0xF2, 0xF1, 0xE4, 0x01, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x02,

0x00, 0x00, 0x00, 0xF1, 0xE2, 0x03, 0x00, 0x00, 0x00, 0xF2,

0xF1, 0xE4, 0x02, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x03, 0x00,

0x00, 0x00, 0xF1, 0xE2, 0x04, 0x00, 0x00, 0x00, 0xF2, 0xF1,

0xE4, 0x03, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x04, 0x00, 0x00,

0x00, 0xF1, 0xE2, 0x05, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,

0x04, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x05, 0x00, 0x00, 0x00,

0xF1, 0xE2, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x05,

0x00, 0x00, 0x00, 0xF1, 0xE1, 0x06, 0x00, 0x00, 0x00, 0xF1,

0xE2, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x08, 0x00, 0x00,

0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6, 0xF7, 0xF1,

0xE4, 0x06, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x07, 0x00, 0x00,

0x00, 0xF1, 0xE2, 0x08, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x09,

0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6,

0xF7, 0xF1, 0xE4, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x08,

0x00, 0x00, 0x00, 0xF1, 0xE2, 0x09, 0x00, 0x00, 0x00, 0xF1,

0xE3, 0x0A, 0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00,

0x00, 0xF6, 0xF7, 0xF1, 0xE4, 0x08, 0x00, 0x00, 0x00, 0xF1,

0xE1, 0x0D, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x13, 0x00, 0x00,

0x00, 0xF8, 0xF1, 0xE4, 0x0D, 0x00, 0x00, 0x00, 0xF1, 0xE7,

0x13, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00,

0xF1, 0xE2, 0x12, 0x00, 0x00, 0x00, 0xF8, 0xF1, 0xE4, 0x0E,

0x00, 0x00, 0x00, 0xF1, 0xE7, 0x12, 0x00, 0x00, 0x00, 0xF1,

0xE1, 0x0F, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x11, 0x00, 0x00,

0x00, 0xF8, 0xF1, 0xE4, 0x0F, 0x00, 0x00, 0x00, 0xF1, 0xE7,

0x11, 0x00, 0x00, 0x00, 0xF4

 

code=[0xF5, 0xF1, 0xE1, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,0x20, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x01, 0x00, 0x00, 0x00,0xF2, 0xF1, 0xE4, 0x21, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x02,0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x22, 0x00, 0x00, 0x00,0xF1, 0xE1, 0x03, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x23,0x00, 0x00, 0x00, 0xF1, 0xE1, 0x04, 0x00, 0x00, 0x00, 0xF2,0xF1, 0xE4, 0x24, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x05, 0x00,0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x25, 0x00, 0x00, 0x00, 0xF1,0xE1, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x26, 0x00,0x00, 0x00, 0xF1, 0xE1, 0x07, 0x00, 0x00, 0x00, 0xF2, 0xF1,0xE4, 0x27, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x08, 0x00, 0x00,0x00, 0xF2, 0xF1, 0xE4, 0x28, 0x00, 0x00, 0x00, 0xF1, 0xE1,0x09, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x29, 0x00, 0x00,0x00, 0xF1, 0xE1, 0x0A, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,0x2A, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0B, 0x00, 0x00, 0x00,0xF2, 0xF1, 0xE4, 0x2B, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0C,0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2C, 0x00, 0x00, 0x00,0xF1, 0xE1, 0x0D, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2D,0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00, 0xF2,0xF1, 0xE4, 0x2E, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0F, 0x00,0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2F, 0x00, 0x00, 0x00, 0xF1,0xE1, 0x10, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x30, 0x00,0x00, 0x00, 0xF1, 0xE1, 0x11, 0x00, 0x00, 0x00, 0xF2, 0xF1,0xE4, 0x31, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x12, 0x00, 0x00,0x00, 0xF2, 0xF1, 0xE4, 0x32, 0x00, 0x00, 0x00, 0xF1, 0xE1,0x13, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x33, 0x00, 0x00,0x00, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xF1,0xE1, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x01, 0x00, 0x00,0x00, 0xF2, 0xF1, 0xE4, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE1,0x01, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x02, 0x00, 0x00, 0x00,0xF2, 0xF1, 0xE4, 0x01, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x02,0x00, 0x00, 0x00, 0xF1, 0xE2, 0x03, 0x00, 0x00, 0x00, 0xF2,0xF1, 0xE4, 0x02, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x03, 0x00,0x00, 0x00, 0xF1, 0xE2, 0x04, 0x00, 0x00, 0x00, 0xF2, 0xF1,0xE4, 0x03, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x04, 0x00, 0x00,0x00, 0xF1, 0xE2, 0x05, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,0x04, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x05, 0x00, 0x00, 0x00,0xF1, 0xE2, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x05,0x00, 0x00, 0x00, 0xF1, 0xE1, 0x06, 0x00, 0x00, 0x00, 0xF1,0xE2, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x08, 0x00, 0x00,0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6, 0xF7, 0xF1,0xE4, 0x06, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x07, 0x00, 0x00,0x00, 0xF1, 0xE2, 0x08, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x09,0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6,0xF7, 0xF1, 0xE4, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x08,0x00, 0x00, 0x00, 0xF1, 0xE2, 0x09, 0x00, 0x00, 0x00, 0xF1,0xE3, 0x0A, 0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00,0x00, 0xF6, 0xF7, 0xF1, 0xE4, 0x08, 0x00, 0x00, 0x00, 0xF1,0xE1, 0x0D, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x13, 0x00, 0x00,0x00, 0xF8, 0xF1, 0xE4, 0x0D, 0x00, 0x00, 0x00, 0xF1, 0xE7,0x13, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00,0xF1, 0xE2, 0x12, 0x00, 0x00, 0x00, 0xF8, 0xF1, 0xE4, 0x0E,0x00, 0x00, 0x00, 0xF1, 0xE7, 0x12, 0x00, 0x00, 0x00, 0xF1,0xE1, 0x0F, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x11, 0x00, 0x00,0x00, 0xF8, 0xF1, 0xE4, 0x0F, 0x00, 0x00, 0x00, 0xF1, 0xE7,0x11, 0x00, 0x00, 0x00, 0xF4,-1,-1,0,0,0,0,0,0,]
i=0
jd=0
while 1:if code[i]==241:if code[i+1]==225:print("mov eax,flag[",code[i+2],"]")elif code[i+1]==226:print("mov ebx,flag[",code[i+2],"]")elif code[i+1]==227:print("mov ecx,flag[",code[i+2],"]")elif code[i+1]==228:print("mov flag[",code[i + 2],"]" ,"eax" )elif code[i+1]==229:print("mov edx,flag[",code[i+2],"]")elif code[i+1]==231:print("mov flag[",code[i + 2],"]" ,"ebx" )i+=6elif code[i]==242:print("xor eax,ebx")i+=1elif code[i]==245:print("judge len")i+=1elif code[i]==244:print("nop")i+=1elif code[i]==247:print("mul eax,edx")i+=1elif code[i]==248:print("XCHG eax,ebx")i+=1elif code[i]==246:print("eax = ecx+2*ebx+3*eax")i+=1elif code[i]==0:i+=1elif code[i]==-1:break

 这里就是根据之前我们分享的,每一段函数什么作用,然后根据给的来还原

judge len
mov eax,flag[ 0 ]
xor eax,ebx
mov flag[ 32 ] eax
mov eax,flag[ 1 ]
xor eax,ebx
mov flag[ 33 ] eax
mov eax,flag[ 2 ]
xor eax,ebx
mov flag[ 34 ] eax
mov eax,flag[ 3 ]
xor eax,ebx
mov flag[ 35 ] eax
mov eax,flag[ 4 ]
xor eax,ebx
mov flag[ 36 ] eax
mov eax,flag[ 5 ]
xor eax,ebx
mov flag[ 37 ] eax
mov eax,flag[ 6 ]
xor eax,ebx
mov flag[ 38 ] eax
mov eax,flag[ 7 ]
xor eax,ebx
mov flag[ 39 ] eax
mov eax,flag[ 8 ]
xor eax,ebx
mov flag[ 40 ] eax
mov eax,flag[ 9 ]
xor eax,ebx
mov flag[ 41 ] eax
mov eax,flag[ 10 ]
xor eax,ebx
mov flag[ 42 ] eax
mov eax,flag[ 11 ]
xor eax,ebx
mov flag[ 43 ] eax
mov eax,flag[ 12 ]
xor eax,ebx
mov flag[ 44 ] eax
mov eax,flag[ 13 ]
xor eax,ebx
mov flag[ 45 ] eax
mov eax,flag[ 14 ]
xor eax,ebx
mov flag[ 46 ] eax
mov eax,flag[ 15 ]
xor eax,ebx
mov flag[ 47 ] eax
mov eax,flag[ 16 ]
xor eax,ebx
mov flag[ 48 ] eax
mov eax,flag[ 17 ]
xor eax,ebx
mov flag[ 49 ] eax
mov eax,flag[ 18 ]
xor eax,ebx
mov flag[ 50 ] eax
mov eax,flag[ 19 ]
xor eax,ebx
mov flag[ 51 ] eax
nop
judge len
mov eax,flag[ 0 ]
mov ebx,flag[ 1 ]
xor eax,ebx
mov flag[ 0 ] eax
mov eax,flag[ 1 ]
mov ebx,flag[ 2 ]
xor eax,ebx
mov flag[ 1 ] eax
mov eax,flag[ 2 ]
mov ebx,flag[ 3 ]
xor eax,ebx
mov flag[ 2 ] eax
mov eax,flag[ 3 ]
mov ebx,flag[ 4 ]
xor eax,ebx
mov flag[ 3 ] eax
mov eax,flag[ 4 ]
mov ebx,flag[ 5 ]
xor eax,ebx
mov flag[ 4 ] eax
mov eax,flag[ 5 ]
mov ebx,flag[ 6 ]
xor eax,ebx
mov flag[ 5 ] eax
mov eax,flag[ 6 ]
mov ebx,flag[ 7 ]
mov ecx,flag[ 8 ]
mov edx,flag[ 12 ]
eax = ecx+2*ebx+3*eax
mul eax,edx
mov flag[ 6 ] eax
mov eax,flag[ 7 ]
mov ebx,flag[ 8 ]
mov ecx,flag[ 9 ]
mov edx,flag[ 12 ]
eax = ecx+2*ebx+3*eax
mul eax,edx
mov flag[ 7 ] eax
mov eax,flag[ 8 ]
mov ebx,flag[ 9 ]
mov ecx,flag[ 10 ]
mov edx,flag[ 12 ]
eax = ecx+2*ebx+3*eax
mul eax,edx
mov flag[ 8 ] eax
mov eax,flag[ 13 ]
mov ebx,flag[ 19 ]
XCHG eax,ebx
mov flag[ 13 ] eax
mov flag[ 19 ] ebx
mov eax,flag[ 14 ]
mov ebx,flag[ 18 ]
XCHG eax,ebx
mov flag[ 14 ] eax
mov flag[ 18 ] ebx
mov eax,flag[ 15 ]
mov ebx,flag[ 17 ]
XCHG eax,ebx
mov flag[ 15 ] eax
mov flag[ 17 ] ebx
nop

其实根据动调,一步一步代入数据就行

根据前面那一堆opcode

http://www.lryc.cn/news/401448.html

相关文章:

  • PyTorch论文
  • 【Python实战因果推断】37_双重差分8
  • 【python学习】第三方库之matplotlib的定义、功能、使用场景和代码示例(线图、直方图、散点图)
  • MySQL(3)表的操作
  • SQL GROUPING运算符详解
  • 在VS2017下FFmpeg+SDL编写最简单的视频播放器
  • LogViewer v2.x更新
  • detection_segmentation
  • 0基础学python-13:古希腊掌管时间的模块——datetime和time
  • 棒球特长生升学具有其独特的优势和劣势·棒球6号位
  • 搜维尔科技:Xsens DOT 可穿戴传感器介绍及示例应用演示
  • 数据分析案例-2024 年热门动漫数据集可视化分析
  • C#小结:未能找到类型或命名空间名“xxx”(是否缺少 using 指令或程序集引用?)
  • STM32智能无人机控制系统教程
  • 从 QWebEnginePage 打印文档
  • 初识Docker及管理Docker
  • 【学术会议征稿】2024年第三届信息学,网络与计算技术国际学术会议(ICINC2024)
  • 在golang中Sprintf和Printf 的区别
  • 策略模式原理与C++实现
  • 打包一个自己的Vivado IP核
  • 《昇思25天学习打卡营第05天|qingyun201003》
  • 【Leetcode】二十一、前缀树 + 词典中最长的单词
  • 秋招Java后端开发冲刺——Mybatis使用总结
  • 怎么压缩视频文件?简单的压缩视频方法分享
  • 【Oracle】Oracle语法之递归查询
  • 【教程】Vue2中使用svg矢量图
  • 简约唯美的404HTML源码
  • PDF 转图片并插入到 EXCEL 再转PDF
  • jmeter之变量随机参数化以及解决多线程不会随机变化
  • 24/7/12总结