首页
社区
课程
招聘
[原创]KCTF2021秋 生命的馈赠 writeup
发表于: 2021-12-9 18:13 18972

[原创]KCTF2021秋 生命的馈赠 writeup

2021-12-9 18:13
18972



====================================分析篇====================================

代码被混淆了


混淆规律

6个call之后,类似下面这样平衡堆栈的指令下面一条,就是真实指令

lea     esp, dword ptr ss:[esp+0x14]

lea     esp, dword ptr ss:[esp+0x8]


====================================逆向篇====================================


输入预设的 name/serial


内存访问断点,返回到这里



0043D6E1    51              push    ecx

0043D6E2    E8 82FAFDFF     call    0041D169 ; 获取serial

0043D6E7    68 80B57D1F     push    0x1F7DB580 ; 这里能看到name/serial

0043D6EC    89DB            mov     ebx, ebx

0043D6EE    50              push    eax

0043D6EF    89E4            mov     esp, esp

0043D6F1    B8 1D000000     mov     eax, 0x1D

0043D6F6    90              nop




然后serial比较长度,必须是32字节 

00466750    5D              pop     ebp

00466751    83F8 20         cmp     eax, 0x20                                       ; 比较长度

00466754    9C              pushfd




单步到这

004DD1DE    C785 00FFFFFF 7>mov     dword ptr ss:[ebp-0x100], 0x10325476 ;md5初始化


看看内存中...

0019FD38  01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10  #Eg壂惋簶vT2

猜测是md5算法,但此时内存中已经出现了正确的md5值

0019FDC4  F4 D5 16 EF CE 55 11 93 B6 6E E1 68 26 51 5A 4F  粽镂U摱n醜&QZO

这正好是name(1A5FBFD826E1D12E)的md5值

所以,这里应该是serial逆推回去算出来的,改一个字节会发现验证错误~



============= 重新分析,发现这个call是关键


004C4F17    E8 8840F7FF     call    00438FA4                                   ; 验证call,ecx = name, edx = serial

004C4F1C    68 66757D1C     push    0x1C7D7566                                 ; 这里验证完毕, al = 1 成功, al = 0 失败

004C4F21    50              push    eax


0049BFAE    B8 F8414000     mov     eax, 004041F8                              ; ASCII "验证正确\n"

0049BFB3    9C              pushfd

0049BFB4    89E4            mov     esp, esp

0049BFB6    9C              pushfd

0049BFB7    89DB            mov     ebx, ebx


004CA73A    8D6424 08       lea     esp, dword ptr ss:[esp+0x8]

004CA73E  ^ 0F85 BE38FAFF   jnz     0046E002                                   ; 爆破点,jmp,验证成功

004CA744    68 BAEB7025     push    0x2570EBBA



call 438fa4

004318D5    81EC 28010000   sub     esp, 0x128

这里提升堆栈空间,可以直接清0堆栈,看看堆栈会出现哪些变量


0043E967                      8D6424 14                               lea     esp, dword ptr ss:[esp+0x14]

0043E96B                      E8 A3B90900                             call    004DA313 ; 似乎是 string to bignum

0043E970                      9C                                      pushfd



004C0B29                      89C0                                    mov     eax, eax

004C0B2B                      8D6424 14                               lea     esp, dword ptr ss:[esp+0x14]

004C0B2F                      E8 D059F9FF                             call    Mul ; 这里似乎是 pow2 

004C0B34                      9C                                      pushfd


456504这个函数,传入2个参数(eax, ecx) ,传出1个参数([esp+4])


执行完看输出地址,这个正好是 EEA43B9D52515B49838AFAA50490DA0B * EEA43B9D52515B49838AFAA50490DA0B = DE75C834F482A299391D073F5D424CAB9AA9FE2AAE920EE2228766F45E16BC79

0019FDA4  79 BC 16 5E F4 66 87 22 E2 0E 92 AE 2A FE A9 9A  y?^鬴??挳*?

0019FDB4  AB 4C 42 5D 3F 07 1D 39 99 A2 82 F4 34 C8 75 DE  獿B]?9櫌傯4萿?



所以上面是Mul

在Mul上面下断点


然后经过一个函数

00444D59                      67:E8 21020100                   call    <modN>

00444D5F                      50                               push    eax                                                          ; 返回1


返回结果为:

0019FDA4  C3 E1 2D 54 FD 5A A8 FC 4F DC D5 D1 6D D8 04 93  冕-T齔O苷裮??

0019FDB4  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

看上去像是取模


我们用 

DE75C834F482A299391D073F5D424CAB9AA9FE2AAE920EE2228766F45E16BC79 - 9304D86DD1D5DC4FFCA85AFD542DE1C3 = 

DE75C834F482A299391D073F5D424CAB07A525BCDCBC329225DF0BF709E8DAB6


然后用yafu分解一下:


factor(0xDE75C834F482A299391D073F5D424CAB07A525BCDCBC329225DF0BF709E8DAB6)


fac: factoring 100621555269000733341031010157969998386759504095520400047147427430100793612982

fac: using pretesting plan: normal

fac: no tune info: using qs/gnfs crossover of 95 digits


starting SIQS on c72: 146405049556078485019294860272741026808150808686274920697977580425648851


==== sieving in progress (1 thread):   16656 relations needed ====

====           Press ctrl-c to abort and save state           ====



SIQS elapsed time = 0.6650 seconds.

Total factoring time = 0.6730 seconds



***factors found***


P39 = 340282366920938463463374607424628147107

P33 = 430245771712568276625619760299793

ans = 1



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-12-12 00:45 被海风月影编辑 ,原因:
收藏
免费 7
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//