好友
阅读权限10
听众
最后登录1970-1-1
|
沉默的小光
发表于 2016-4-17 15:48
最近一直在学习反汇编,想通过自己的学习,达到比较高的水平。用crackMe160系列来作为练习。crackMe160题下载地址: http://pan.baidu.com/s/1xUWOY%20%E5%AF%86%E7%A0%81:%20jbnq] 密码: jbnq,感谢前辈44018723提供地址
刚开始几题对自己的要求都是能爆破就行,现在我对自己的要求是要能找到注册码才行
这周一直在研究VB5的反汇编,直到昨天才基本入门,然后突然感觉有了读汇编代码的能力有了不少提升,连续破了crackMe中第9到11题
这几题都来自于同一个作者,我想难度设置上应该也是由浅入深的,今天结大家讲一讲我研究第11题的心得,过程全部由自己摸索而得,希望可以和大家一起讨论一下
首先打开第11题的程序:
是这样的一个类似密码盘的界面,经过简单的尝试发现,要输入的话电脑键盘是已经被屏蔽了的,只能通过鼠标点击来输入
成功之后界面会有所变化,但是在这之前没有任何反应
打开OD,附加到这个进程上,然后点Alt+E,选中程序的Andrena模块,右键,跟随入口
进入模块之后,因为是VB5程序,这次有经验了,直接查找UNICODE字符串
右键,中文搜索引擎,搜索UNICODE
发现并没有我们想找的一看就知道是提示信息的字串
返回刚才的界面,右键-》分析-》分析代码之后,把程序往下拉,找到一个
__vbaVarTstEq(总共有很多个,所以轻松一找就到了),经验告诉我们这里就是要做判断输入是否正确的地方了
[Asm] 纯文本查看 复制代码 0040C5F8 > \8D45 CC lea eax,dword ptr ss:[ebp-0x34]
0040C5FB . 8D8D 4CFFFFFF lea ecx,dword ptr ss:[ebp-0xB4]
0040C601 . 50 push eax ; /var18 = NULL
0040C602 . 51 push ecx ; |var28 = 2CC20000
0040C603 . C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],Andréna.0040>; |0817E747D7AFF7C7F82836D74RR7A7F7E7B7C7D826D8KKE7B7C
0040C60D . C785 4CFFFFFF>mov dword ptr ss:[ebp-0xB4],0x8008 ; |
0040C617 . FF15 5C104000 call dword ptr ds:[<&MSVBVM60.__vbaVarTs>; \__vbaVarTstEq
0040C61D . 66:85C0 test ax,ax
0040C620 . 74 4C je short Andréna.0040C66E
0040C622 . 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
0040C625 . 50 push eax
0040C626 . 8B10 mov edx,dword ptr ds:[eax]
0040C628 . FF92 38030000 call dword ptr ds:[edx+0x338]
0040C62E . 50 push eax
0040C62F . 8D45 AC lea eax,dword ptr ss:[ebp-0x54]
0040C632 . 50 push eax
0040C633 . FF15 3C104000 call dword ptr ds:[<&MSVBVM60.__vbaObjSe>; msvbvm60.__vbaObjSet
0040C639 . 8B08 mov ecx,dword ptr ds:[eax]
0040C63B . 68 BC1E4000 push Andréna.00401EBC ; REGISTRIERT
0040C640 . 50 push eax
0040C641 . 8985 30FFFFFF mov dword ptr ss:[ebp-0xD0],eax
0040C647 . FF51 54 call dword ptr ds:[ecx+0x54]
这个JE跳转非常可疑,尝试下个断点,点运行让程序跑起来,果然马上就被断下了
把这个JE用NOP填充一下(选中那一行,右键,二进制,用NOP填充),强制不跳转
禁用断点,再点执行,看界面已经变成了这样
表明刚才那里正是我们要找的地方。
重新执行程序之后,再找到刚才的位置
往回看,这下突然发现好多个和刚才结构完全一样的代码,尝试下断点之后能发现也会被断下
于是我干脆直接往上找到这个函数初始化的地方去
[Asm] 纯文本查看 复制代码 0040B145 . 33F6 xor esi,esi
0040B147 . 57 push edi
0040B148 . 8975 DC mov dword ptr ss:[ebp-0x24],esi
0040B14B . 8975 CC mov dword ptr ss:[ebp-0x34],esi
0040B14E . 8975 BC mov dword ptr ss:[ebp-0x44],esi
0040B151 . 8975 B8 mov dword ptr ss:[ebp-0x48],esi
0040B154 . 8975 B4 mov dword ptr ss:[ebp-0x4C],esi
0040B157 . 8975 B0 mov dword ptr ss:[ebp-0x50],esi
0040B15A . 8975 AC mov dword ptr ss:[ebp-0x54],esi
0040B15D . 8975 9C mov dword ptr ss:[ebp-0x64],esi
0040B160 . 8975 8C mov dword ptr ss:[ebp-0x74],esi
0040B163 . 89B5 7CFFFFFF mov dword ptr ss:[ebp-0x84],esi
0040B169 . 89B5 6CFFFFFF mov dword ptr ss:[ebp-0x94],esi
0040B16F . 89B5 5CFFFFFF mov dword ptr ss:[ebp-0xA4],esi
0040B175 . 89B5 4CFFFFFF mov dword ptr ss:[ebp-0xB4],esi
0040B17B . 89B5 3CFFFFFF mov dword ptr ss:[ebp-0xC4],esi
0040B181 . 89B5 18FFFFFF mov dword ptr ss:[ebp-0xE8],esi
0040B187 . 89B5 08FFFFFF mov dword ptr ss:[ebp-0xF8],esi
0040B18D . 89B5 F8FEFFFF mov dword ptr ss:[ebp-0x108],esi
0040B193 . 89B5 E8FEFFFF mov dword ptr ss:[ebp-0x118],esi
0040B199 . 89B5 D8FEFFFF mov dword ptr ss:[ebp-0x128],esi
0040B19F . 89B5 C8FEFFFF mov dword ptr ss:[ebp-0x138],esi
0040B1A5 . 89B5 B8FEFFFF mov dword ptr ss:[ebp-0x148],esi
0040B1AB . 89B5 A8FEFFFF mov dword ptr ss:[ebp-0x158],esi
0040B1B1 . 89B5 98FEFFFF mov dword ptr ss:[ebp-0x168],esi
0040B1B7 . 89B5 88FEFFFF mov dword ptr ss:[ebp-0x178],esi
0040B1BD . 89B5 78FEFFFF mov dword ptr ss:[ebp-0x188],esi
0040B1C3 . 89B5 68FEFFFF mov dword ptr ss:[ebp-0x198],esi
0040B1C9 . 89B5 58FEFFFF mov dword ptr ss:[ebp-0x1A8],esi
0040B1CF . 89B5 48FEFFFF mov dword ptr ss:[ebp-0x1B8],esi
0040B1D5 . 89B5 38FEFFFF mov dword ptr ss:[ebp-0x1C8],esi
0040B1DB . 89B5 28FEFFFF mov dword ptr ss:[ebp-0x1D8],esi
0040B1E1 . 89B5 18FEFFFF mov dword ptr ss:[ebp-0x1E8],esi
0040B1E7 . 89B5 08FEFFFF mov dword ptr ss:[ebp-0x1F8],esi
0040B1ED . 89B5 F8FDFFFF mov dword ptr ss:[ebp-0x208],esi
0040B1F3 . 89B5 E8FDFFFF mov dword ptr ss:[ebp-0x218],esi
0040B1F9 . 89B5 D8FDFFFF mov dword ptr ss:[ebp-0x228],esi
0040B1FF . 89B5 C8FDFFFF mov dword ptr ss:[ebp-0x238],esi
0040B205 . 89B5 B8FDFFFF mov dword ptr ss:[ebp-0x248],esi
0040B20B . 89B5 A8FDFFFF mov dword ptr ss:[ebp-0x258],esi
0040B211 . 89B5 98FDFFFF mov dword ptr ss:[ebp-0x268],esi
0040B217 . 89B5 88FDFFFF mov dword ptr ss:[ebp-0x278],esi
0040B21D . 89B5 78FDFFFF mov dword ptr ss:[ebp-0x288],esi
0040B223 . 89B5 68FDFFFF mov dword ptr ss:[ebp-0x298],esi
0040B229 . 89B5 58FDFFFF mov dword ptr ss:[ebp-0x2A8],esi
0040B22F . 89B5 48FDFFFF mov dword ptr ss:[ebp-0x2B8],esi
从这一堆置为0的代码里我们可以看到,这就是函数初始化的地方了,后面有很多很多个一模一样的结构在重复地执行,但并不知道它们之间有什么关联
下了断点一句一句往下看
到了
[Asm] 纯文本查看 复制代码 0040B26D > \8B45 B8 mov eax,dword ptr ss:[ebp-0x48] ; 输入的key的值
这一句的时候发现,OD提示我们这是一个字符串,正是我们输入的key值
顺带提一下,之前浪费好多时间来研究VB5是因为不熟悉它是怎么工作的,我把我的一点小经验告诉大家
VB在进行变量传值的时候通常不会传具体值,它会把变量的地址加载到寄存器里再把寄存器的值压到栈里,以这样的形式传值
像这样
为什么要这样呢,这是因为在VB5中,变量不是单纯的一个数值而已,它的存储包含两部分,前8个字节放变量的数据类型,后8个字节开始才放变量的值(大部分变量)
所以,我们想看一个变量的值的话通常需要这样的命令:
db ebp-54+8,db [eax+8](针对字符型的)
一个变量的首地址+8才是它的值所在地址
明白这些之后,慢慢地读程序我们会发现
这个程序是把输入的值的前两位转化成一个两位的十进制数字(0到100),再加到每一个输入的字符上去,得到一个新的ASCII码,再把这个ASCII以两个字节的十六进制数的字符形式表示出来
具体过程:
[Asm] 纯文本查看 复制代码 00408F90 . FF90 A0000000 call dword ptr ds:[eax+0xA0] ; 取key的值到ebp-48+8
00408F96 . 3BC6 cmp eax,esi ; msvbvm60.__vbaStrVarVal
00408F98 . DBE2 fclex
00408F9A . 7D 12 jge short Andréna.00408FAE
00408F9C . 68 A0000000 push 0xA0
00408FA1 . 68 B81D4000 push Andréna.00401DB8
00408FA6 . 57 push edi ; msvbvm60.__vbaVarMove
00408FA7 . 50 push eax
00408FA8 . FF15 2C104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>; msvbvm60.__vbaHresultCheckObj
00408FAE > 8B45 B8 mov eax,dword ptr ss:[ebp-0x48]
00408FB1 . 8B3D 08104000 mov edi,dword ptr ds:[<&MSVBVM60.__vbaVa>; msvbvm60.__vbaVarMove
00408FB7 . 8D55 9C lea edx,dword ptr ss:[ebp-0x64]
00408FBA . 8D4D BC lea ecx,dword ptr ss:[ebp-0x44]
00408FBD . 8975 B8 mov dword ptr ss:[ebp-0x48],esi ; msvbvm60.__vbaStrVarVal
00408FC0 . 8945 A4 mov dword ptr ss:[ebp-0x5C],eax
00408FC3 . C745 9C 08000>mov dword ptr ss:[ebp-0x64],0x8
00408FCA . FFD7 call edi ; msvbvm60.__vbaVarMove; <&MSVBVM60.__vbaVarMove>
00408FCC . 8D4D AC lea ecx,dword ptr ss:[ebp-0x54] ; 挪到ebp-64+8
00408FCF . FF15 D4104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>; msvbvm60.__vbaFreeObj
00408FD5 . 89B5 54FFFFFF mov dword ptr ss:[ebp-0xAC],esi ; msvbvm60.__vbaStrVarVal
00408FDB . BE 02000000 mov esi,0x2
00408FE0 . 8D95 4CFFFFFF lea edx,dword ptr ss:[ebp-0xB4]
00408FE6 . 8D4D CC lea ecx,dword ptr ss:[ebp-0x34]
00408FE9 . 89B5 4CFFFFFF mov dword ptr ss:[ebp-0xB4],esi ; INTEGER型
00408FEF . FFD7 call edi ; msvbvm60.__vbaVarMove
00408FF1 . B8 01000000 mov eax,0x1 ; ebp-34置"0"
00408FF6 . 8D95 4CFFFFFF lea edx,dword ptr ss:[ebp-0xB4]
00408FFC . 8985 54FFFFFF mov dword ptr ss:[ebp-0xAC],eax ; NULL型
00409002 . 8985 44FFFFFF mov dword ptr ss:[ebp-0xBC],eax
00409008 . 8D45 BC lea eax,dword ptr ss:[ebp-0x44] ; key的值
0040900B . 52 push edx ; /Step8 = 0018FAFC
0040900C . 8D4D 9C lea ecx,dword ptr ss:[ebp-0x64] ; |
0040900F . 50 push eax ; |/var18 = 0018FA7C
00409010 . 51 push ecx ; ||retBuffer8 = 00000002
00409011 . 89B5 4CFFFFFF mov dword ptr ss:[ebp-0xB4],esi ; ||msvbvm60.__vbaStrVarVal
00409017 . 89B5 3CFFFFFF mov dword ptr ss:[ebp-0xC4],esi ; ||msvbvm60.__vbaStrVarVal
0040901D . FF15 30104000 call dword ptr ds:[<&MSVBVM60.__vbaLenVa>; |\__vbaLenVar
00409023 . 50 push eax ; |End8 = 0018FA7C
00409024 . 8D95 3CFFFFFF lea edx,dword ptr ss:[ebp-0xC4] ; |ebp-64+8为输入的KEY长度
0040902A . 8D85 08FFFFFF lea eax,dword ptr ss:[ebp-0xF8] ; |
00409030 . 52 push edx ; |Start8 = 0018FAFC
00409031 . 8D8D 18FFFFFF lea ecx,dword ptr ss:[ebp-0xE8] ; |
00409037 . 50 push eax ; |TMPend8 = 0018FA7C
00409038 . 8D55 DC lea edx,dword ptr ss:[ebp-0x24] ; |
0040903B . 51 push ecx ; |TMPstep8 = 00000002
0040903C . 52 push edx ; |Counter8 = 0018FAFC
0040903D . FF15 38104000 call dword ptr ds:[<&MSVBVM60.__vbaVarFo>; \__vbaVarForInit
00409043 . 8B35 80104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaSt>; msvbvm60.__vbaStrVarVal
00409049 . 8B1D B4104000 mov ebx,dword ptr ds:[<&MSVBVM60.#617>] ; msvbvm60.rtcLeftCharVar
0040904F > 85C0 test eax,eax
00409051 . 0F84 29010000 je Andréna.00409180
00409057 . 8D45 BC lea eax,dword ptr ss:[ebp-0x44] ; key的值
0040905A . 6A 01 push 0x1
0040905C . 8D4D 8C lea ecx,dword ptr ss:[ebp-0x74]
0040905F . 50 push eax
00409060 . 51 push ecx
00409061 . FFD3 call ebx ; msvbvm60.rtcLeftCharVar
00409063 . 8D55 8C lea edx,dword ptr ss:[ebp-0x74]
00409066 . 8D45 B0 lea eax,dword ptr ss:[ebp-0x50]
00409069 . 52 push edx
0040906A . 50 push eax
0040906B . FFD6 call esi ; msvbvm60.__vbaStrVarVal
0040906D . 50 push eax
0040906E . FF15 D8104000 call dword ptr ds:[<&MSVBVM60.#581>] ; msvbvm60.rtcR8ValFromBstr
00409074 . DD9D 34FFFFFF fstp qword ptr ss:[ebp-0xCC] ; 转成64位浮点
0040907A . 8D4D 9C lea ecx,dword ptr ss:[ebp-0x64]
0040907D . 8D55 DC lea edx,dword ptr ss:[ebp-0x24]
00409080 . 51 push ecx
00409081 . 52 push edx
00409082 . C745 A4 01000>mov dword ptr ss:[ebp-0x5C],0x1
00409089 . C745 9C 02000>mov dword ptr ss:[ebp-0x64],0x2
00409090 . FF15 AC104000 call dword ptr ds:[<&MSVBVM60.__vbaI4Var>; msvbvm60.__vbaI4Var
00409096 . 50 push eax ; INTEGER型
00409097 . 8D45 BC lea eax,dword ptr ss:[ebp-0x44]
0040909A . 8D4D B8 lea ecx,dword ptr ss:[ebp-0x48]
0040909D . 50 push eax
0040909E . 51 push ecx
0040909F . FFD6 call esi ; msvbvm60.__vbaStrVarVal
004090A1 . 50 push eax ; 取ascii码值
004090A2 . FF15 4C104000 call dword ptr ds:[<&MSVBVM60.#631>] ; msvbvm60.rtcMidCharBstr
004090A8 . 8BD0 mov edx,eax
004090AA . 8D4D B4 lea ecx,dword ptr ss:[ebp-0x4C]
004090AD . FF15 BC104000 call dword ptr ds:[<&MSVBVM60.__vbaStrMo>; msvbvm60.__vbaStrMove
004090B3 . 50 push eax ; /String = "?"
004090B4 . FF15 20104000 call dword ptr ds:[<&MSVBVM60.#516>] ; \rtcAnsiValueBstr
004090BA . 0FBFD0 movsx edx,ax ; 取ASCII码值
004090BD . 8995 FCFCFFFF mov dword ptr ss:[ebp-0x304],edx
004090C3 . C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],0x5
004090CD . DB85 FCFCFFFF fild dword ptr ss:[ebp-0x304] ; 转双精度浮点压栈
004090D3 . DD9D F4FCFFFF fstp qword ptr ss:[ebp-0x30C]
004090D9 . DD85 F4FCFFFF fld qword ptr ss:[ebp-0x30C] ; 64位浮点
004090DF . DC85 34FFFFFF fadd qword ptr ss:[ebp-0xCC]
004090E5 . DD5D 84 fstp qword ptr ss:[ebp-0x7C] ; 和到ebp-7c
004090E8 . DFE0 fstsw ax
004090EA . A8 0D test al,0xD
004090EC . 0F85 FA1F0000 jnz Andréna.0040B0EC
004090F2 . 8D85 7CFFFFFF lea eax,dword ptr ss:[ebp-0x84] ; 5
004090F8 . 50 push eax
004090F9 . FF15 94104000 call dword ptr ds:[<&MSVBVM60.#572>] ; msvbvm60.rtcHexBstrFromVar
004090FF . 8D4D CC lea ecx,dword ptr ss:[ebp-0x34] ; 和转成String
00409102 . 8985 74FFFFFF mov dword ptr ss:[ebp-0x8C],eax ; 存到ebp-94+8
00409108 . 8D95 6CFFFFFF lea edx,dword ptr ss:[ebp-0x94]
0040910E . 51 push ecx
0040910F . 8D85 5CFFFFFF lea eax,dword ptr ss:[ebp-0xA4]
00409115 . 52 push edx
00409116 . 50 push eax
00409117 . C785 6CFFFFFF>mov dword ptr ss:[ebp-0x94],0x8
00409121 . FF15 84104000 call dword ptr ds:[<&MSVBVM60.__vbaVarCa>; msvbvm60.__vbaVarCat
00409127 . 8BD0 mov edx,eax
00409129 . 8D4D CC lea ecx,dword ptr ss:[ebp-0x34]
0040912C . FFD7 call edi ; msvbvm60.__vbaVarMove
0040912E . 8D4D B0 lea ecx,dword ptr ss:[ebp-0x50]
00409131 . 8D55 B4 lea edx,dword ptr ss:[ebp-0x4C]
00409134 . 51 push ecx
00409135 . 8D45 B8 lea eax,dword ptr ss:[ebp-0x48]
00409138 . 52 push edx
00409139 . 50 push eax
0040913A . 6A 03 push 0x3
0040913C . FF15 9C104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>; msvbvm60.__vbaFreeStrList
00409142 . 8D8D 6CFFFFFF lea ecx,dword ptr ss:[ebp-0x94]
00409148 . 8D95 7CFFFFFF lea edx,dword ptr ss:[ebp-0x84]
0040914E . 51 push ecx
0040914F . 8D45 8C lea eax,dword ptr ss:[ebp-0x74]
00409152 . 52 push edx
00409153 . 8D4D 9C lea ecx,dword ptr ss:[ebp-0x64]
00409156 . 50 push eax
00409157 . 51 push ecx
00409158 . 6A 04 push 0x4
0040915A . FF15 14104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeV>; msvbvm60.__vbaFreeVarList
00409160 . 83C4 24 add esp,0x24
00409163 . 8D95 08FFFFFF lea edx,dword ptr ss:[ebp-0xF8]
00409169 . 52 push edx ; /TMPend8 = 0018FAFC
0040916A . 8D85 18FFFFFF lea eax,dword ptr ss:[ebp-0xE8] ; |
00409170 . 8D4D DC lea ecx,dword ptr ss:[ebp-0x24] ; |
00409173 . 50 push eax ; |TMPstep8 = 0018FA7C
00409174 . 51 push ecx ; |Counter8 = 00000002
00409175 . FF15 C8104000 call dword ptr ds:[<&MSVBVM60.__vbaVarFo>; \__vbaVarForNext
0040917B .^ E9 CFFEFFFF jmp Andréna.0040904F
00409180 > 8D55 CC lea edx,dword ptr ss:[ebp-0x34]
00409183 . 8D85 4CFFFFFF lea eax,dword ptr ss:[ebp-0xB4]
00409189 . 52 push edx ; /var18 = 0018FAFC
0040918A . 50 push eax ; |var28 = 0018FA7C
0040918B . C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],Andréna.0040>; |0817E747D7AFF7C7F82836D74RR7A7F7E7B7C7D826D81KE7B7C
00409195 . C785 4CFFFFFF>mov dword ptr ss:[ebp-0xB4],0x8008 ; |
0040919F . FF15 5C104000 call dword ptr ds:[<&MSVBVM60.__vbaVarTs>; \__vbaVarTstEq
拿这一段来说,首先取出来的key放在ebp-48这个变量里,再通过__vbaVarMove把它挪到变量ebp-64里去
接着把变量ebp-34置为"0",也就是单独的一个字符0
后面通过__vbaStrVarVal开始一个循环
在循环里拿出变量的前两个字符转成浮点类存在ebp-cc里面
再取第x个字符(x是循环变量counter)ASCII码值,转成64位浮点数,与ebp-cc相加,再转成ASCII码,再把这个ASCII码十六进制数以两个字符表示存在ebp-94里
再通过__vbaVarCat把ebp-94里的字符连接到ebp-34上去。
循环结束后得到一串字符ebp-34与ebp-b4通过__vbaVarTstEq进行字串比较,成功就显示我们刚才成功爆破的那个界面
但是要准备开始计算时我傻眼了,发现这个字串里居然带有"R",这是十六进制数里不可能含有的东西
我顿时明白了这么多的相同的结构是什么用途了
右键,中文搜索引擎,搜索UNICODE,能看到一堆这样的码,仔细一看,里面不是含有G,就是含有K,H,或是R
找了好久终于发现一个正常一点的
看来这一个才是真正的码,其余的都是起干扰作用的
跟进去下断点一看果然之前代码功能完全相同
现在就是要找到这样一个字符串了
通过计算发现当前两位为74时,正好符合81 7E开头的密码
于是利用C语言计算源码:
[C++] 纯文本查看 复制代码 void main()
{
int i;
char key[100]={0},str[2];
int num[100];
strcpy(key,"81 7E 74 7D 7A 7D 7C 7F 82 83 6D 74 74 7A 7F 7E 7B 7C 7D 82 6D 81 7E 7B 7C ");
for(i=0;i<strlen(key)/3;i++)
{
sscanf(key+i*3,"%x ",num+i);
num[i] -= 74;
printf("%c",num[i]);
}
printf("\n");
}
结果如下
填到crackMe中果然可行
至此破解工作结束
|
免费评分
-
查看全部评分
|