XMAN【我真的好菜-同pizza师傅修炼笔记四】hackcon-app.exe

前言

我好菜啊!真的没人看电影么?我请客!?
Again!有小姐姐一起看电影的么?!
hhhh~

分析

首先是个windows程序,PE32+尝试运行报缺少dll,百度一下发现是用minGW编译的,于是在电脑上装了minGW但还是运行不了。-。-!!
IDA查看全局搜索字符串可以看到virtual字样,而且看这个程序的结构,套了四层while,肯定是一个vm的题,同时看到导入函数中有onexit函数,这是一个linux下的回调函数,会在程序退出时执行注册的函数,不过这里对解题没什么影响。
我们可以很快的定位到main函数
XMAN【我真的好菜-同pizza师傅修炼笔记四】hackcon-app.exe_第1张图片
bytecode变量名的提示也很明显,向上找到其交叉引用,可以到GLOBAL__sub_I__ZN7Machine8do_stuffEv这个函数中,然后_refptr__binary_keycheck_start dq offset _binary_keycheck_start,就可以找到bytecode,将其提取出来,按照vm的规则进行整理。如下

 bytecode:
 10 06 41 00 00 00 mov r6 0x41
 10 07 50 00 00 00 mov r7 0x50
 10 0A 08 00 00 00 mov ra 0x8
 05 07 0A          r7 <<= ra            r7 = 0x50 << 0x8
 10 08 56 00 00 00 mov r8 0x56
 10 0A 10 00 00 00 mov ra 0x10
 05 08 0A          r8 <<= ra            r8 = 0x56 << 0x10
 10 09 45 00 00 00 mov r9 0x45
 10 0A 18 00 00 00 mov ra 0x18
 05 09 0A          r9 <<= ra            r9 = 0x45 << 0x18
 02 06 07          r6 |= r7             r6 = 0x41 | r7 | r8 | r9
 02 06 08          r6 |= r8
 02 06 09          r6 |= r9
 11 07 03          mov r7 r3
 00 07 06          r7 ^= r6             r7 = r3 ^ r6
 11 06 02          mov r6 r2
 00 06 03          r6 ^= r3             r6 = r2 ^ r3
 10 08 0E 73 02 01 mov r8 0x0102730e    
 00 06 08          r6 ^= r8             r6 = r6 ^ 0x0102730e
 10 05 04 AA 10 03 mov r5 0x0310aa04
 03 05 01          r5 += r1             
 00 05 02          r5 ^= r2             r5 = (0x0310aa04 + r1)^r2
 11 08 00          mov r8 r0            r8 = r0
 10 09 01 D3 F0 04 mov r9 0x04f0d301
 04 08 09          r8 -= r9             r8 = (r0 - 0x04f0d301)^r1
 00 08 01          r8 ^= r1
 02 05 06          r5 |= r6
 02 05 07          r5 |= r7
 02 05 08          r5 |= r8             r5 = r5 | r6 | r7 | r8
 11 00 05          mov r0 r5
 FF                is right ?           r0 != 0 correct! else false
 00 00 00 00 00 00 00
 88 35 40 

这个vm真的不难,就是有的时候脑壳有点疼。
整理一下加密过程如下:

from libnum import n2s,s2n
r3=s2n('XXXX')
r2=s2n('XXXX')
r1=s2n('XXXX')
r0=s2n('XXXX')
r7=0x50<<0x8
r8=0x56<<0x10
r9=0x45<<0x18
r6=0x41|r7|r8|r9
print r6 #1163284545
r7 = r3^r6
r6=r2^r3^0x0102730e
r5 = (0x0310aa04 + r1)^r2
r8 = (r0 - 0x04f0d301)^r1
r5 = (0x0310aa04 + r1)^r2 | r2^r3^0x0102730e | r3^1163284545 | (r0 - 0x04f0d301)^r1
if r5 == 0:
    print 'corrert'
else:
    print "error"
print r5

辣么,只需使每个|都为0即可。
直接口算的。。。

r3 = 1163284545     #F4LL
r2 = 1146364751     #ACyK
r1 = 1094941003     #DT#O
r0 = 1177832524     #EVPA
print n2s(r0)
print n2s(r1)
print n2s(r2)
print n2s(r3)

总结

我真的好菜!
pizza师傅称这是水题。反正低头就是了!。

你可能感兴趣的:(CTF,Re)