首页
论坛
课程
招聘
雪    币: 1686
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝

[原创][CTF.TSRC 2018]第二题-半加器(速解)

2018-12-3 23:23 742

[原创][CTF.TSRC 2018]第二题-半加器(速解)

2018-12-3 23:23
742
一种极速解法。所用工具:IDA,windbg.

0.0. windbg载入,lm获得base address;IDA rebase至相同地址,方便对比分析。

0.1. 任意输入,提示"输入错误"。IDA载入,轻易发现字符串"输入错误",跳至引用处,开始分析。

1.0. 输入长度判断
.text:00A419FE 68 68 30 B9 00                          push    offset unk_B93068    ;输入
.text:00A41A03 E8 9E 8F FE FF                          call    sub_A2A9A6        ;获得输入长度
.text:00A41A08 83 C4 04                                add     esp, 4
.text:00A41A0B 89 45 F8                                mov     [ebp+var_8], eax 
.text:00A41A0E 83 7D F8 1E                             cmp     [ebp+var_8], 1Eh
.text:00A41A12 7F 06                                   jg      short loc_A41A1A
.text:00A41A14 83 7D F8 0A                             cmp     [ebp+var_8], 0Ah
.text:00A41A18 7D 16                                   jge     short loc_A41A30        ;输入长度在10~30之间

1.1. 输入中特定位置的字符限定
.text:00A41A30 68 68 30 B9 00                          push    offset unk_B93068 ;输入
.text:00A41A35 6A 1E                                   push    1Eh ; buffer最大长度限制
.text:00A41A37 A1 88 30 B9 00                          mov     eax, dword_B93088 ; 输入长度
.text:00A41A3C 50                                      push    eax
.text:00A41A3D E8 7D CB FE FF                          call    sub_A2E5BF
.text:00A41A42 83 C4 0C                                add     esp, 0Ch
.text:00A41A45 B8 01 00 00 00                          mov     eax, 1
.text:00A41A4A 6B C8 07                                imul    ecx, eax, 7
.text:00A41A4D 8B 15 88 30 B9 00                       mov     edx, dword_B93088
.text:00A41A53 0F BE 04 0A                             movsx   eax, byte ptr [edx+ecx]
.text:00A41A57 83 F8 41                                cmp     eax, 41h        ; 输入字符串偏移0x7为字符A (0x41)
.text:00A41A5A 74 14                                   jz      short loc_A41A70
.text:00A41A5C 68 CC 25 B5 00                          push    offset aFIAG    ; "输入错误;"
.text:00A41A61 E8 75 8C FE FF                          call    sub_A2A6DB

1.2. 处理输入字符串
.text:00A41A75 50                                      push    eax
.text:00A41A76 E8 29 B9 FE FF                          call    sub_A2D3A4
...
.text:00A2D3A4 E9 27 08 01 00                          jmp     sub_A3DBD0
...
.text:00A3DBF8 B8 01 00 00 00                          mov     eax, 1
.text:00A3DBFD 6B C8 07                                imul    ecx, eax, 7
.text:00A3DC00 8B 55 08                                mov     edx, [ebp+arg_0] ; input
.text:00A3DC03 C6 04 0A 23                             mov     byte ptr [edx+ecx], 23h ;将原字符串偏移0x7变为字符#(0x23)
...
.text:00A3DC10                         loc_A3DC10:                             ; CODE XREF: sub_A3DBD0+6Ej
.text:00A3DC10 8B 45 F8                                mov     eax, [ebp+var_8]
.text:00A3DC13 83 C0 01                                add     eax, 1
.text:00A3DC16 89 45 F8                                mov     [ebp+var_8], eax
.text:00A3DC19
.text:00A3DC19                         loc_A3DC19:                             ; CODE XREF: sub_A3DBD0+3Ej
.text:00A3DC19 8B 45 08                                mov     eax, [ebp+arg_0]
.text:00A3DC1C 50                                      push    eax
.text:00A3DC1D E8 84 CD FE FF                          call    sub_A2A9A6
.text:00A3DC22 83 C4 04                                add     esp, 4
.text:00A3DC25 39 45 F8                                cmp     [ebp+var_8], eax ;遍历字符串中所有字符
.text:00A3DC28 73 16                                   jnb     short loc_A3DC40
.text:00A3DC2A 8B 45 08                                mov     eax, [ebp+arg_0]
.text:00A3DC2D 03 45 F8                                add     eax, [ebp+var_8]
.text:00A3DC30 0F BE 08                                movsx   ecx, byte ptr [eax] 
.text:00A3DC33 83 F1 1F                                xor     ecx, 1Fh        ;每个字符与0x1F异或,得到新字符串。
.text:00A3DC36 8B 55 08                                mov     edx, [ebp+arg_0]
.text:00A3DC39 03 55 F8                                add     edx, [ebp+var_8]
.text:00A3DC3C 88 0A                                   mov     [edx], cl
.text:00A3DC3E EB D0                                   jmp     short loc_A3DC10

1.3. 字符串比较
大杀器来了:
当 sub_A2D3A4完成后,在新字符串地址上直接下内存访问断点,直接来到0xae7df4处,即如下代码片段:
.text:00AE7DE0 8B 54 24 04                             mov     edx, [esp+arg_0] ; 待比较字符串1
.text:00AE7DE4 8B 4C 24 08                             mov     ecx, [esp+arg_4] ; 待比较字符串2
.text:00AE7DE8 F7 C2 03 00 00 00                       test    edx, 3
.text:00AE7DEE 75 40                                   jnz     short loc_AE7E30
.text:00AE7DF0
.text:00AE7DF0                         loc_AE7DF0:                             ; CODE XREF: sub_AE7DE0+3Cj
.text:00AE7DF0                                                                 ; sub_AE7DE0+6Ej
.text:00AE7DF0                                                                 ; sub_AE7DE0+8Aj
.text:00AE7DF0 8B 02                                   mov     eax, [edx]
.text:00AE7DF2 3A 01                                   cmp     al, [ecx]
.text:00AE7DF4 75 32                                   jnz     short loc_AE7E28 ;内存访问断点在此断下。
.text:00AE7DF6 84 C0                                   test    al, al
.text:00AE7DF8 74 26                                   jz      short loc_AE7E20
.text:00AE7DFA 3A 61 01                                cmp     ah, [ecx+1]
.text:00AE7DFD 75 29                                   jnz     short loc_AE7E28
.text:00AE7DFF 84 E4                                   test    ah, ah
.text:00AE7E01 74 1D                                   jz      short loc_AE7E20
.text:00AE7E03 C1 E8 10                                shr     eax, 10h
.text:00AE7E06 3A 41 02                                cmp     al, [ecx+2]
.text:00AE7E09 75 1D                                   jnz     short loc_AE7E28
.text:00AE7E0B 84 C0                                   test    al, al
.text:00AE7E0D 74 11                                   jz      short loc_AE7E20
.text:00AE7E0F 3A 61 03                                cmp     ah, [ecx+3]
.text:00AE7E12 75 14                                   jnz     short loc_AE7E28
.text:00AE7E14 83 C1 04                                add     ecx, 4
.text:00AE7E17 83 C2 04                                add     edx, 4
.text:00AE7E1A 84 E4                                   test    ah, ah
.text:00AE7E1C 75 D2                                   jnz     short loc_AE7DF0
.text:00AE7E1E 8B FF                                   mov     edi, edi

显然是在比较两个待比较字符串.
分别db ecx, db edx。发现ecx为1.2计算所得,而edx为:
0:000:x86> db edx
00b91000  75 72 6a 7d 70 75 78 3c-7d 6e 7b 69 71 79 72 68  urj}pux<}n{iqyrh

1.4 反向计算正确字符串
1.3中dump得到的字符串每字节异或0x1F, 并将第7位还原为A,得到:jmubojgAbqdvnfmw 经验证为正确答案。

完。


HWS计划·2020安全精英夏令营来了!我们在华为松山湖欧洲小镇等你

最后于 2018-12-3 23:25 被supercolin编辑 ,原因: 高亮关键代码
最新回复 (0)
游客
登录 | 注册 方可回帖
返回