v3_str为[ebp+str[0]至[ebp+str[0]+23h]的数组内容,两个数组之间每个索引值进行异或操作赋值给v3_str(具体要看实际汇编指令,翻译成的伪代码不一定正确),循环36次后结束。
vm1.exe实现了一个简单的8位虚拟机(VM),试图阻止逆向工程师检索flag。VM的RAM包含加密标flag和一些字节码来解密它。你能弄清楚VM是如何工作的吗并解密flag?ram.bin中提供了VM的RAM副本(此数据与执行前恶意软件VM的ram内容相同,并包含自定义程序集代码和加密flag)
# coding:utf-8 vm_chars = [ 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x7E, 0x7D, 0x55, 0x1E, 0x05, 0xE6, 0x9F, 0xE4, 0xA6, 0x47, 0x50, 0x02, 0x01, 0xC7, 0xFC, 0xCB, 0x60, 0x09, 0xC6, 0x0E, 0x2E, 0x41, 0x65, 0xA4, 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, 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, 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, 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, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1D, 0xBD, 0x01, 0x05, 0x53, 0x01, 0x12, 0x48, 0x01, 0x10, 0xE6, 0x01, 0x13, 0x8A, 0x01, 0x0D, 0x47, 0x01, 0x16, 0x13, 0x01, 0x0A, 0x15, 0x01, 0x00, 0x98, 0x01, 0x02, 0x3C, 0x01, 0x18, 0xD9, 0x01, 0x1A, 0x57, 0x01, 0x06, 0xAB, 0x01, 0x1B, 0xC6, 0x01, 0x01, 0x32, 0x01, 0x17, 0x20, 0x01, 0x15, 0x6F, 0x01, 0x11, 0x2D, 0x01, 0x08, 0xC9, 0x01, 0x09, 0xE7, 0x01, 0x03, 0x12, 0x01, 0x0C, 0x2F, 0x01, 0x0E, 0x88, 0x01, 0x19, 0x6C, 0x01, 0x04, 0x65, 0x01, 0x1E, 0xAE, 0x01, 0x14, 0x59, 0x01, 0x1F, 0x91, 0x01, 0x1C, 0x5D, 0x01, 0x0F, 0xAE, 0x01, 0x0B, 0x15, 0x01, 0x07, 0xCC, 0x02, 0x20, 0x00, 0x03, 0x00, 0x00, 0x02, 0x21, 0x00, 0x03, 0x01, 0x00, 0x02, 0x22, 0x00, 0x03, 0x02, 0x00, 0x02, 0x23, 0x00, 0x03, 0x03, 0x00, 0x02, 0x24, 0x00, 0x03, 0x04, 0x00, 0x02, 0x25, 0x00, 0x03, 0x05, 0x00, 0x02, 0x26, 0x00, 0x03, 0x06, 0x00, 0x02, 0x27, 0x00, 0x03, 0x07, 0x00, 0x02, 0x28, 0x00, 0x03, 0x08, 0x00, 0x02, 0x29, 0x00, 0x03, 0x09, 0x00, 0x02, 0x2A, 0x00, 0x03, 0x0A, 0x00, 0x02, 0x2B, 0x00, 0x03, 0x0B, 0x00, 0x02, 0x2C, 0x00, 0x03, 0x0C, 0x00, 0x02, 0x2D, 0x00, 0x03, 0x0D, 0x00, 0x02, 0x2E, 0x00, 0x03, 0x0E, 0x00, 0x02, 0x2F, 0x00, 0x03, 0x0F, 0x00, 0x02, 0x30, 0x00, 0x03, 0x10, 0x00, 0x02, 0x31, 0x00, 0x03, 0x11, 0x00, 0x02, 0x32, 0x00, 0x03, 0x12, 0x00, 0x02, 0x33, 0x00, 0x03, 0x13, 0x00, 0x02, 0x34, 0x00, 0x03, 0x14, 0x00, 0x02, 0x35, 0x00, 0x03, 0x15, 0x00, 0x02, 0x36, 0x00, 0x03, 0x16, 0x00, 0x02, 0x37, 0x00, 0x03, 0x17, 0x00, 0x02, 0x38, 0x00, 0x03, 0x18, 0x00, 0x01, 0x19, 0x00, 0x04, 0x00, 0x00, 0x00 ] vm_code = vm_chars[255:] result = 1 n = 0 def decode(one, two, three): global tmp if one == 1: vm_chars[two] = three elif one == 2: tmp = vm_chars[two] else: if one != 3: return 0 vm_chars[two] = vm_chars[two] ^ tmp return 1 while result: one = vm_code[n] two = vm_code[n + 1] three = vm_code[n + 2] n += 3 result = decode(one, two, three) print(bytearray(vm_chars))