题目来源

vm crackme

upload successful

程序给了三个文件,主要是要求我们通过分析vm1.exe文件的虚拟机,然后自己实现虚拟机,执行ram.bin中的opcode

ida分析

upload successful

程序先申请一个堆,然后将unk_404040copy到Dst中,进而执行sub_4022e0_

upload successful

依次取出Dst中的数据,然后调用sub_402270,可知255之后的数据是opcode,255之前的数据是data

upload successful

这就是opcode执行的主要函数

实现自己的虚拟机

f = open("./ram.bin","rb")
opcode = list(f.read())

data = opcode[:0xff]

for i in range(0,len(data)):
    data[i] = ord(opcode[i])

def sub_402270(v0,v1,v2):
    global byte
    if v0 == 1:
        data[v1] = v2;
        print "mov data[%d], 0x%x"%(v1,v2)
    elif v0 == 2:
        byte = data[v1]
        print "mov rax, data[%d]"%v1
    elif v0 == 3:
        data[v1] = data[v1] ^ byte
        print "xor data[%d], rax"%v1

for i in range(0,len(opcode)-257,3):
    v0 = opcode[255+i]
    v1 = opcode[256+i]
    v2 = opcode[257+i]
    if v0 == 4:
        break
    sub_402270(ord(v0),ord(v1),ord(v2))

print ''.join(chr(i) for i in data)

执行结果

mov data[29], 0xbd
mov data[5], 0x53
mov data[18], 0x48
mov data[16], 0xe6
mov data[19], 0x8a
mov data[13], 0x47
mov data[22], 0x13
mov data[10], 0x15
mov data[0], 0x98
mov data[2], 0x3c
mov data[24], 0xd9
mov data[26], 0x57
mov data[6], 0xab
mov data[27], 0xc6
mov data[1], 0x32
mov data[23], 0x20
mov data[21], 0x6f
mov data[17], 0x2d
mov data[8], 0xc9
mov data[9], 0xe7
mov data[3], 0x12
mov data[12], 0x2f
mov data[14], 0x88
mov data[25], 0x6c
mov data[4], 0x65
mov data[30], 0xae
mov data[20], 0x59
mov data[31], 0x91
mov data[28], 0x5d
mov data[15], 0xae
mov data[11], 0x15
mov data[7], 0xcc
mov rax, data[32]
xor data[0], rax
mov rax, data[33]
xor data[1], rax
mov rax, data[34]
xor data[2], rax
mov rax, data[35]
xor data[3], rax
mov rax, data[36]
xor data[4], rax
mov rax, data[37]
xor data[5], rax
mov rax, data[38]
xor data[6], rax
mov rax, data[39]
xor data[7], rax
mov rax, data[40]
xor data[8], rax
mov rax, data[41]
xor data[9], rax
mov rax, data[42]
xor data[10], rax
mov rax, data[43]
xor data[11], rax
mov rax, data[44]
xor data[12], rax
mov rax, data[45]
xor data[13], rax
mov rax, data[46]
xor data[14], rax
mov rax, data[47]
xor data[15], rax
mov rax, data[48]
xor data[16], rax
mov rax, data[49]
xor data[17], rax
mov rax, data[50]
xor data[18], rax
mov rax, data[51]
xor data[19], rax
mov rax, data[52]
xor data[20], rax
mov rax, data[53]
xor data[21], rax
mov rax, data[54]
xor data[22], rax
mov rax, data[55]
xor data[23], rax
mov rax, data[56]
xor data[24], rax
mov data[25], 0x0
FLAG{VMS-ARE-FOR-MALWARE}W�]����~}U��GP���`    �.Ae�

总结

第一次逆向vm程序,初次体验了被vm虐哭的感觉



reverse      reverse vm

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!