vm_逆向

Posted by Humb1e on 2023-05-16
Estimated Reading Time 2 Minutes
Words 728 In Total
Viewed Times

VM逆向

从上个学期就意识到自己不会vm逆向有很大一部分原因是汇编不会,寒假学了汇编,学的不好,汇编还是不会,总想着留到暑假用大把的时间再去学习和总结。

然后突然意识到这样逃避永远也学不会自己害怕的东西。

于是就开始摁看了。

从最简单的虚拟机开始。

mainly from [原创]对VM逆向的分析(CTF)(比较经典的一个虚拟机逆向题目)-CTF对抗-看雪-安全社区|安全招聘|kanxue.com

图片描述

这个图还是比较清晰的

所以第一个就是得找到eip和模拟的汇编指令

用这题非常经典的题目来积累一点经验

(里面的寄存器和eip基本上都已经重命名了)

vm_nop

image-20230516225008654

这是一个比较有意思的汇编指令,eip++相当于什么都没做其实就对应了汇编中的nop

vm_mov

image-20230516225056171

从这里的byte的地址可以看出其实他们就是两个相邻的机器码

把第一个数给v0,第二个数给v1

eip+3(3其实就是一条指令的长度)

然后把v1给到reg[v0]

其实就是mov reg[v0],v1

vm_push_data

image-20230516225311912

同样的,v1是第一个数据

i就是栈指针,扩大了栈,然后把v1放进栈里

对应了push v1

vm_push_reg

image-20230516225457945

原理同上,不过v1换成了reg罢了

相当于push reg

vm_pop_reg

image-20230516225550874

这里先取了栈中的数据,然后把栈里的数据给了一个寄存器

相当于pop reg

vm_printf

image-20230516225654892

这题独有的printf

vm_add_reg1_reg2

image-20230516225737210

取了两个reg相加

相当于add reg[v0],reg[v1]

vm_sub_reg1_reg2

image-20230516225934104

同上

相当于sub reg[v0],reg[v1]

vm_mul

image-20230516230025652

很显然的乘法

相当于mul reg[v0],reg[v1](好像记得汇编只有mul reg,因为另一个乘数已经放到一个寄存器里了)

vm_div

image-20230516230205272

同上

相当于div reg[v0],reg[v1](同上,汇编只有div reg,但是这里意思意思,能看懂就行)

vm_xor

image-20230516230500821

嘿嘿,我觉得逆向人最喜欢看见的就是异或了

不解释

相当于xor reg[v0],reg[v1]

vm_jmp

image-20230516230604828

一开始有点疑惑,为什么是3*opcode[eip]-3

后面对eip的赋值说明肯定是jmp类的

想一想3是指令长度,eip的赋值又没有条件应该就是jmp

这里jmp的方法是指令长度*数据似乎和汇编有点不同

相当于jmp [addr]

vm_cmp

image-20230516230810063

有一个减,返回的是减的结果,就是cmp了

相当于cmp reg[v0],reg[v1]

vm_je

image-20230516231007870

这里我直接把标志寄存器叫做flag了

可以判断出flag!=0时跳转

或许应该把flag改成ZF更好?

相当于jne [addr]

其他的就不写了,基本上都涉及到了

对于这些东西的打印分析又是一个问题了,今天先到此为止吧。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !