VM逆向
从上个学期就意识到自己不会vm逆向有很大一部分原因是汇编不会,寒假学了汇编,学的不好,汇编还是不会,总想着留到暑假用大把的时间再去学习和总结。
然后突然意识到这样逃避永远也学不会自己害怕的东西。
于是就开始摁看了。
从最简单的虚拟机开始。
mainly from [原创]对VM逆向的分析(CTF)(比较经典的一个虚拟机逆向题目)-CTF对抗-看雪-安全社区|安全招聘|kanxue.com
这个图还是比较清晰的
所以第一个就是得找到eip和模拟的汇编指令
用这题非常经典的题目来积累一点经验
(里面的寄存器和eip基本上都已经重命名了)
vm_nop
这是一个比较有意思的汇编指令,eip++相当于什么都没做其实就对应了汇编中的nop
vm_mov
从这里的byte的地址可以看出其实他们就是两个相邻的机器码
把第一个数给v0,第二个数给v1
eip+3(3其实就是一条指令的长度)
然后把v1给到reg[v0]
其实就是mov reg[v0],v1
vm_push_data
同样的,v1是第一个数据
i就是栈指针,扩大了栈,然后把v1放进栈里
对应了push v1
vm_push_reg
原理同上,不过v1换成了reg罢了
相当于push reg
vm_pop_reg
这里先取了栈中的数据,然后把栈里的数据给了一个寄存器
相当于pop reg
vm_printf
这题独有的printf
vm_add_reg1_reg2
取了两个reg相加
相当于add reg[v0],reg[v1]
vm_sub_reg1_reg2
同上
相当于sub reg[v0],reg[v1]
vm_mul
很显然的乘法
相当于mul reg[v0],reg[v1](好像记得汇编只有mul reg,因为另一个乘数已经放到一个寄存器里了)
vm_div
同上
相当于div reg[v0],reg[v1](同上,汇编只有div reg,但是这里意思意思,能看懂就行)
vm_xor
嘿嘿,我觉得逆向人最喜欢看见的就是异或了
不解释
相当于xor reg[v0],reg[v1]
vm_jmp
一开始有点疑惑,为什么是3*opcode[eip]-3
后面对eip的赋值说明肯定是jmp类的
想一想3是指令长度,eip的赋值又没有条件应该就是jmp
这里jmp的方法是指令长度*数据似乎和汇编有点不同
相当于jmp [addr]
vm_cmp
有一个减,返回的是减的结果,就是cmp了
相当于cmp reg[v0],reg[v1]
vm_je
这里我直接把标志寄存器叫做flag了
可以判断出flag!=0时跳转
或许应该把flag改成ZF更好?
相当于jne [addr]
其他的就不写了,基本上都涉及到了
对于这些东西的打印分析又是一个问题了,今天先到此为止吧。
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !