最近趁上课之余,刷了一下CTF(https://ctf.bugku.com/challenges)
不好用的CE,言外之意就是说这道题用CE 不好做,这里先分享一下网上其他大佬的解题方式:https://blog.51cto.com/13992485/2429569
下面是我的解题方式:
1、先打开程序,观察
双击程序,出现一个对话框
之后是主界面,点击command 可以是值增加1
这里我的思路:
1、爆破:写一个程序,模拟点击10000次
2、尝试修改值,直接修改到9999,再次操作
这里,我果断选择第二个方式(其实第一个试了一下,比较内存了,CPU 也一下子就飚上去了)
首先,查看有没有壳(一般都是无壳的,但是还是查看一下)
如图:程序是VB 写的,无壳,nice
2、CE附加,尝试查看变量
这里我尝试搜索精确数值,但是发现精确值收缩到最后是一个死胡同,因为有时候是可以查找到这些值,但更多时候,这些值可能只是那么几个值才产生变动,基本上从精确值这里切入比较难,而且即使找到了值,并且进行了修改,在这次显示值是修改了的,但是到了下一次时,值也会自动校正。所以我尝试搜索未知初始值,并且通过不断变动值,缩小搜索范围,最终查到以下数据:
分别对这些数据进行改写查看,获得以下代码段
数据1: 00401D41 - 8B 16 - mov edx,[esi] 00401D43 - 56 - push esi 00401D44 - DD 5E 34 - fstp qword ptr [esi+34] << 00401D47 - DFE0 - fnstsw ax 00401D49 - A8 0D - test al,0D 数据2: 77E82C6C - 85 C0 - test eax,eax 77E82C6E - 0F84 89C00100 - je ntdll.RtlpUnWaitCriticalSection+7F 77E82C74 - FF 87 FC000000 - inc [edi+000000FC] << 77E82C7A - C6 45 E6 01 - mov byte ptr [ebp-1A],01 77E82C7E - 8B 75 08 - mov esi,[ebp+08] 77E83105 - 85 C0 - test eax,eax 77E83107 - 0F84 13BC0100 - je ntdll.RtlpUnWaitCriticalSection+A2 77E8310D - FF 83 FC000000 - inc [ebx+000000FC] << 77E83113 - F7 43 48 00000060 - test [ebx+48],60000000 77E8311A - 0F85 F7000100 - jne ntdll.RtlPcToFileHeader+1DC 数据3: 77E8313B - 75 30 - jne ntdll.RtlQueryPerformanceCounter+7E9 77E8313D - 05 02000100 - add eax,00010002 77E83142 - 89 46 04 - mov [esi+04],eax << 77E83145 - 39 7D 90 - cmp [ebp-70],edi 77E83148 - 0F85 914E0000 - jne ntdll.LdrUnlockLoaderLock+100D 77E82CDB - 83 F9 02 - cmp ecx,02 77E82CDE - 72 04 - jb ntdll.RtlQueryPerformanceCounter+360 77E82CE0 - 83 40 04 FE - add dword ptr [eax+04],-02 << 77E82CE4 - F6 46 02 08 - test byte ptr [esi+02],08 77E82CE8 - 0F85 9FEA0100 - jne ntdll.TpDisassociateCallback+652 数据4: 77E82F07 - 3B D8 - cmp ebx,eax 77E82F09 - 0F85 2A7A0500 - jne ntdll.RtlUlonglongByteSwap+DBE9 77E82F0F - 89 02 - mov [edx],eax << 77E82F11 - 89 4A 04 - mov [edx+04],ecx 77E82F14 - 89 11 - mov [ecx],edx 数据5: 72942039 - 03 F2 - add esi,edx 7294203B - 2B C2 - sub eax,edx 7294203D - 89 37 - mov [edi],esi << 7294203F - 89 47 04 - mov [edi+04],eax 72942042 - 8D 04 7F - lea eax,[edi+edi*2] 数据6: 7294203B - 2B C2 - sub eax,edx 7294203D - 89 37 - mov [edi],esi 7294203F - 89 47 04 - mov [edi+04],eax << 72942042 - 8D 04 7F - lea eax,[edi+edi*2] 72942045 - 8D 04 80 - lea eax,[eax+eax*4] 数据7: 779B9962 - 89 44 8F F8 - mov [edi+ecx*4-08],eax 779B9966 - 8B 44 8E FC - mov eax,[esi+ecx*4-04] 779B996A - 89 44 8F FC - mov [edi+ecx*4-04],eax << 779B996E - 8D 04 8D 00000000 - lea eax,[ecx*4+00000000] 779B9975 - 03 F0 - add esi,eax 数据8: 779B9962 - 89 44 8F F8 - mov [edi+ecx*4-08],eax 779B9966 - 8B 44 8E FC - mov eax,[esi+ecx*4-04] 779B996A - 89 44 8F FC - mov [edi+ecx*4-04],eax << 779B996E - 8D 04 8D 00000000 - lea eax,[ecx*4+00000000] 779B9975 - 03 F0 - add esi,eax
观察上面的数据,可以发现数据5和数据6是同一段代码,数据7和数据8也是同一段代码,所以我选择充这里作为切入点(其实其他代码也是可以的,只是我直觉这里应该比较好分析)
3、OD 附加(工具:dbg x32.exe),并跳转到选定目标地址:0x7294203F
在此处下断点,并且跟进,同时查看堆栈和寄存器数值变化
在此处下断,发现数值是在当前CALL 上层修改的,返回到上层代码:
这里代码看了一下,发现也有很多下一个的数值,暂时没看出啥,所以返回到函数头部,再次断下,从头不看看哪里数值是比较可疑的
查看EDI + 0x84 的数据
在此处进行硬件写入断点,再次点击按钮
与之前类似,这里的数据也是上层计算得出的,再次向上层回溯,这里省略部分,因为之后的操作和这里类似,上上层回溯,知道跳转到主模块地址处,即
以0x0040开始的地址,一般在此处可能会进行值的判断,弹窗之类的
在这里附近查看代码,也可以断下后调试,查看执行过程,我这里使用绘制功能直观展示它的执行流程
尝试修改代码:
修改后的效果:
出现了一个对话框,这个字符串应该就是flag
高高兴兴去填写答案,打脸来的太快,答案是错误的,在分析一下字符串
DeZmqMUhRcP8NgJgzLPdXa
看起来图像Base64 加密的,试一下解密,呵呵,打脸虽迟但到
然后冥思苦想,突然顿悟(其实是看了别的博客思路)
居然是Base58,。。。。。
OK,解码,获取flag 提交。
PS:如果你使用的OD, 那直接搜索字符串就可以找到这条数据,当然,dbg也是可以搜索到的,但是与之一起的还有N 多条其他字符串
PS2: 这里是我自己分析的这个程序的算法代码的位置,自己没太懂,求大佬讲解一下这里算法实现
75CC04E8 | 8BF8 | mov edi,eax | 75CC04EA | 33C0 | xor eax,eax | eax = 0 75CC04EC | 83C7 11 | add edi,11 | 75CC04EF | 40 | inc eax | eax ++ 75CC04F0 | F645 A8 F0 | test byte ptr ss:[ebp-58],F0 | 75CC04F4 | 0F84 17010000 | je oleaut32.75CC0611 | 75CC04FA | 53 | push ebx | 75CC04FB | 6A 08 | push 8 | 75CC04FD | 5E | pop esi | esi = 8 75CC04FE | 6A 30 | push 30 | 75CC0500 | 8D5445 AC | lea edx,dword ptr ss:[ebp+eax*2-54] | 拿到缓冲区地址 75CC0504 | 5B | pop ebx | ebx = 30 75CC0505 | 8A4C35 A0 | mov cl,byte ptr ss:[ebp+esi-60] | 循环 75CC0509 | 8AC1 | mov al,cl | cl 是当前数据的前两位 75CC050B | C0E8 04 | shr al,4 | eax = 1 75CC050E | 66:0FB6C0 | movzx ax,al | 75CC0512 | 66:03C3 | add ax,bx | 计算每一位eax = 31 75CC0515 | 66:8902 | mov word ptr ds:[edx],ax | 写到缓冲区 75CC0518 | 80E1 0F | and cl,F | cl + F 75CC051B | 42 | inc edx | edx ++ 移到缓冲区下一位 75CC051C | 66:0FB6C1 | movzx ax,cl | 75CC0520 | 42 | inc edx | 75CC0521 | 66:03C3 | add ax,bx | 75CC0524 | 66:8902 | mov word ptr ds:[edx],ax | 75CC0527 | 42 | inc edx | 75CC0528 | 42 | inc edx | 75CC0529 | 4E | dec esi | 75CC052A | 79 D9 | jns oleaut32.75CC0505 |
[公告]看雪论坛2020激励机制上线了:“活跃值”、“能力值”、“雪币”!发帖、回帖不减雪币了!赶紧回帖看看你的活跃值?
最后于 4天前 被tutuj编辑 ,原因: 修改错误