gwctf-2019-babyvm详细分析
本文最后更新于:4 年前
与 vm 代码保护的初次交锋
代码分析
main函数 情况
vminit 函数
虚拟机启动函数
0xf4 是 结束标志 retn
opcode
真好看, 这样的opcode , 可惜是假的
最后的比较
vm指令分析
下面函数名称都是自己起的
mov 指令
每次执行, 将 eip 移动6 位, 对应 0xf1
xor_encerypto
eip 移动 1 位, 对应 0xf2
vm_eip_add
将 eip 向前移动一位, 并且是 retn 标志 , 对应 0xf4
vm_mul
r0 = r0 * r3
eip 移动一位, 对应 0xf7
vm_swap
r0,r1 = r1,r0
将 r1, r0 做交换, eip 移动一位, 对应 0xf8
vm_define_mul
r0 = r2 + (r1*2) + (r3 * 3)
eip 移动一位, 对应 0xf6
指令分析
fake code 分析
这样看, 直接可以看出 执行流程
读取输入 到堆栈上
0xf1 0xe1 -> 0xf2 -> 0xf1 0xe4
读取堆栈上的字符,按照索引 读取, xor 加密, 和 r1 进行, 在放到堆栈中, base: 0x20
结束
解题
1 |
|
吓得我直接看了 wp
https://github.com/gwht/2019GWCTF/tree/master/wp/reverse/babyvm
并且表示疑惑, 你的 代码都没有调用这个指令, 谁能想到呢, 我吐了。
第二次opcode 分析
1 |
|
思路:
前六位 xor 求解
z3 解出 6, 7 , 8,
后面 六位进行交换
这里偷懒,没写脚本, 直接抄的 wp 里的
1 |
|
getflag!!!
Y0u_hav3_r3v3rs3_1t!
总结
第一次独立 做出 vm , 从 中午10点多, 一直到下午 6 点才结束, 可以看出,我是真的很菜, 我会慢慢赶上来的,真的。
开始享受, 程序 从黑盒变成白盒的感觉, 希望自己能够坚持下去吧。
2021.4.25
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!