CTF不好用的CE瞎搞
2020-06-22 02:51:40 Author: bbs.pediy.com(查看原文) 阅读量:581 收藏

最近趁上课之余,刷了一下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编辑 ,原因: 修改错误


文章来源: https://bbs.pediy.com/thread-260160.htm
如有侵权请联系:admin#unsafe.sh