首页
社区
课程
招聘
KCTF2023第五题 争分夺秒
2023-9-13 09:26 8481

KCTF2023第五题 争分夺秒

2023-9-13 09:26
8481
目录

check_47B430

程序存在大量混淆,可根据我们输入的交叉引用和函数返回值的交叉引用进行筛选

b64decode_40A580

输入为base64编码

1
2
3
4
5
6
7
8
.text:0047D5F7 loc_47D5F7:                             ; CODE XREF: check_47B430+21A9↑j
.text:0047D5F7                 lea     ecx, [ebp+outsz]
.text:0047D5FD                 push    ecx
.text:0047D5FE                 lea     edx, [ebp+out]
.text:0047D604                 push    edx
.text:0047D605                 mov     eax, [ebp+myinput]
.text:0047D608                 push    eax
.text:0047D609                 call    b64decode_40A580

check_crc32_455F80

解编码后[-4:]为crc32校验值

1
2
3
4
5
6
.text:00480406 loc_480406:                             ; CODE XREF: check_47B430+4FD2↑j
.text:00480406                 mov     edx, [ebp+outsz]
.text:0048040C                 push    edx
.text:0048040D                 mov     eax, [ebp+out]
.text:00480413                 push    eax
.text:00480414                 call    check_crc32_455F80

parse_2part_458D90

分成2部分

每部分结构

1
2
3
4
5
6
7
8
9
10
struct Part{
    DWORD dw;
    DWORD sz;
    BYTE data[sz];
}
 
//整体结构
base64({
    Part1,Part2,Crc32
})
1
2
3
4
5
6
7
8
9
10
11
.text:00482CEF loc_482CEF:                             ; CODE XREF: check_47B430+78BB↑j
.text:00482CEF                 lea     edx, [ebp+a4]
.text:00482CF5                 push    edx             ; a4
.text:00482CF6                 lea     eax, [ebp+a3]
.text:00482CFC                 push    eax             ; a3
.text:00482CFD                 mov     ecx, [ebp+outsz]
.text:00482D03                 sub     ecx, 4
.text:00482D06                 push    ecx             ; a2
.text:00482D07                 mov     edx, [ebp+out]
.text:00482D0D                 push    edx             ; a1
.text:00482D0E                 call    parse_2part_458D90

a3、a4为分成的2个部分,交叉引用查找后续处理

check_part1_2_ny_474170

校验每部分头部dw,(固定值,可通过求解逆元得到)

函数内通过 call check_ny_4CE450校验dw值

1
2
3
4
5
6
7
8
.text:00485639 loc_485639:                             ; CODE XREF: check_47B430+A12A↑j
.text:00485639                 mov     ecx, [ebp+a4]
.text:0048563F                 mov     edx, [ecx]
.text:00485641                 push    edx
.text:00485642                 mov     eax, dword ptr [ebp+a3]
.text:00485648                 mov     ecx, [eax]
.text:0048564A                 push    ecx
.text:0048564B                 call    check_part1_2_ny_474170

计算逆元

1
2
3
from Crypto.Util.number import*
print('dw1:',hex(inverse(0x7d45,0x346F8717)))
print('dw2:',hex(inverse(0XD711,0X729969FF)))

xor_4E1620

在xor_4E1620函数前后有混淆干扰,
xortable没必要获取,后面可通过校验结果反推。

xor data,通过dw值生成固定xor序列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.text:004E490F loc_4E490F:                             ; CODE XREF: xor_4E1620+32EB↑j
.text:004E490F                 mov     edx, [ebp+var_42C]
.text:004E4915                 push    edx
.text:004E4916                 mov     eax, [ebp+var_480]
.text:004E491C                 push    eax
.text:004E491D                 mov     ecx, [ebp+var_254]
.text:004E4923                 push    ecx
.text:004E4924                 mov     edx, [ebp+var_248]
.text:004E492A                 push    edx
.text:004E492B                 call    sub_4D6450      ; 生成xor数
.text:004E4930 ; 848:     *(_BYTE *)(v318 + data) ^= v3;
.text:004E4930                 add     esp, 10h
.text:004E4933                 movzx   eax, al
.text:004E4936                 mov     ecx, [ebp+data]
.text:004E4939                 add     ecx, [ebp+index]
.text:004E493F                 movzx   edx, byte ptr [ecx]
.text:004E4942                 xor     edx, eax
.text:004E4944                 mov     eax, [ebp+data]
.text:004E4947                 add     eax, [ebp+index]
.text:004E494D                 mov     [eax], dl        ;异或

last_check_45F640

校验data部分是否为固定值的逆元

1
2
3
4
5
6
7
8
9
10
11
12
13
.text:00468051                 mov     ecx, [ebp+var_98C] ; p
.text:00468057                 push    ecx
.text:00468058                 mov     edx, [ebp+temp] ; b
.text:0046805E                 push    edx
.text:0046805F                 mov     eax, [ebp+Block] ; a
.text:00468065                 push    eax
.text:00468066                 call    final_4C50C0    ; 校验a∗b≡1(mod p)
 
 
……………………
 
 
.text:00470F73                 call    final_4C50C0

动态调试,在final_4C50C0设断

可得到a,p,计算逆元可得b

第一部分

a

1
011F2D28  5B 2A C8 AA 00 00 00 00 00 00 00 00 00 00 00 00  [*Ȫ............ 

p

1
2
3
4
5
011F2EC8  03 8D B6 BB BD 8A DB 73 AC 57 2C 60 51 99 E6 EC  ..¶»½.Ûs¬W,`Q.æì 
011F2ED8  AE 56 98 E1 D4 56 BA 9F 90 2B F6 50 9F 1D 23 91  ®V.áÔVº..+öP..#. 
011F2EE8  8E 28 AF B9 A4 C5 06 C7 7D AA 28 8E BE 40 12 33  .(¯¹¤Å.Ç}ª(.¾@.3 
011F2EF8  7E 76 17 96 CE 3B 48 2E 83 2E 2C 79 A4 E3 41 0D  ~v..Î;H...,y¤ãA. 
011F2F08  A3 D1 8E 58 C0 AB D6 B8 C1 D3 00 00 00 00 00 00  £Ñ.XÀ«Ö¸ÁÓ...... 

求得逆元b:

1
0x6ddef790e191493676bc241c61a0d3f337ffc3de16fdbf001a08ada8b08e3be1681c6199eb9ccb74538a5a6c96af3bfb609a48a821c2d2418a946cdc3e58991c9b3476d9018a6c685709

a2

1
015E2D28  5F 47 95 83 00 00 00 00 00 00 00 00 00 00 00 00  _G.............. 

p2

1
2
3
4
5
015E2EC8  05 B3 44 98 B0 EF 11 F7 EB 3B 97 8C A2 FB 6D 6A  .³D.°ï.÷ë;..¢ûmj 
015E2ED8  59 17 C6 A1 98 8B 9C 21 D4 89 06 EC CF 8D E7 74  Y.Æ¡...!Ô..ìÏ.çt 
015E2EE8  30 83 37 88 B4 6C 7A 2E 3D 91 50 5E 25 D1 8F EF  0.7.´lz.=.P^%Ñ.ï 
015E2EF8  12 78 5B AF 3D BA B8 EC 5F 3D FC 7B 37 5B 2D 72  .x[¯=º¸ì_=ü{7[-
015E2F08  5C EC 12 2C 59 57 AF 41 B4 B5 00 00 00 00 00 00  \ì.,YW¯A´µ...... 

求得逆元b2:

1
0x5f3f01d89b8a41c9154b1bf2723b0dbe0a9459757c270d0cefc5645a329dd9722091f014c2809413fb7ed30796e7eab585bda2259bf94b833662240207f52f20d8e01e903a4b025c7d58

但此时b经过前面xor处理,

只需再次构造输入后调试,便可得到正确的data

1
2
3
4
b1:  b'\xf5P\xc4\xd1\x1b\xe8\x85E\xa1~\xdfI\xa6\x00\xd3\x02\x12\xa1w`\xf8\x14\xf0T\xf2R\xf5\xfa\xc9\xe3\xc9\x15\xb1\x19]\x9f-R\xf3\xbb\xd2\xcbV\x90\x98,\x85\xdf\xbc\xa0\xc4\x10!2\xcf\xf2^G@\xf3\xc9\xc7\x11t\x80,Y\xa7\xfa\xf9\x8d\xae\xbcR'
 
b2: 
b'TD\x9b\xc8\xe9q:o-\xe6\x9a\xcc\xea\xdb+\xb5_U\x02\x94\xd7\xf4\xd8\x87\xd5a\xc8X\xc1-t\xaa!\x8eEvm\x07\x999\x1a\x8ca\x7f^?\xb0\x0f\xd4\x99^\x9ePw\x10\x07!\x85\x82a\xa2#\xfbGssl\xe6\x02ru\xe7\xa9\xec'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import binascii
from Crypto.Util.number import*
import base64
 
def outf():
    b1=b'\xf5P\xc4\xd1\x1b\xe8\x85E\xa1~\xdfI\xa6\x00\xd3\x02\x12\xa1w`\xf8\x14\xf0T\xf2R\xf5\xfa\xc9\xe3\xc9\x15\xb1\x19]\x9f-R\xf3\xbb\xd2\xcbV\x90\x98,\x85\xdf\xbc\xa0\xc4\x10!2\xcf\xf2^G@\xf3\xc9\xc7\x11t\x80,Y\xa7\xfa\xf9\x8d\xae\xbcR'
    b2=b'TD\x9b\xc8\xe9q:o-\xe6\x9a\xcc\xea\xdb+\xb5_U\x02\x94\xd7\xf4\xd8\x87\xd5a\xc8X\xc1-t\xaa!\x8eEvm\x07\x999\x1a\x8ca\x7f^?\xb0\x0f\xd4\x99^\x9ePw\x10\x07!\x85\x82a\xa2#\xfbGssl\xe6\x02ru\xe7\xa9\xec'
    data=inverse(0x7d45,0x346F8717).to_bytes(4,'little')+len(b1).to_bytes(4,'little')+b1+\
        inverse(0XD711,0X729969FF).to_bytes(4,'little')+len(b2).to_bytes(4,'little')+b2
    crcn=binascii.crc32(data)
    data+=crcn.to_bytes(4,'little')
    print(base64.b64encode(data).decode())
if __name__=='__main__':
    outf()

flag

1
KmJTMUoAAAD1UMTRG+iFRaF+30mmANMCEqF3YPgU8FTyUvX6yePJFbEZXZ8tUvO70stWkJgshd+8oMQQITLP8l5HQPPJxxF0gCxZp/r5ja68Up2kckNKAAAAVESbyOlxOm8t5prM6tsrtV9VApTX9NiH1WHIWMEtdKohjkV2bQeZORqMYX9eP7AP1JlenlB3EAchhYJhoiP7R3NzbOYCcnXnqewe7SYM

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞2
打赏
分享
最新回复 (1)
雪    币: 19431
活跃值: (29097)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-9-15 09:52
2
1
感谢分享
游客
登录 | 注册 方可回帖
返回