-
-
[原创]KCTF2021秋 生命的馈赠 writeup
-
发表于: 2021-12-9 18:13 18991
-
====================================分析篇====================================
代码被混淆了
混淆规律
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期)
赞赏
- [原创]KCTF2021秋 第十一题 图穷匕见 writeup 18842
- [原创]KCTF2021秋 生命的馈赠 writeup 18992
- [原创]KCTF2021秋 万事俱备 writeup 18451
- 第七题 声名远扬 WriteUp 13643
- [原创]KCTF2021秋季赛第二题WriteUp 12807