程序存在大量混淆,可根据我们输入的交叉引用和函数返回值的交叉引用进行筛选
输入为base64编码
解编码后[-4:]为crc32校验值
分成2部分
每部分结构
a3、a4为分成的2个部分,交叉引用查找后续处理
校验每部分头部dw,(固定值,可通过求解逆元得到)
函数内通过 call check_ny_4CE450校验dw值
计算逆元
在xor_4E1620函数前后有混淆干扰,
xortable没必要获取,后面可通过校验结果反推。
xor data,通过dw值生成固定xor序列
校验data部分是否为固定值的逆元
可得到a,p,计算逆元可得b
第一部分
a
p
求得逆元b:
a2
p2
求得逆元b2:
但此时b经过前面xor处理,
只需再次构造输入后调试,便可得到正确的data
flag
.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
.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
.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
.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
struct
Part{
DWORD
dw;
DWORD
sz;
BYTE
data[sz];
}
base64({
Part1,Part2,Crc32
})
struct
Part{
DWORD
dw;
DWORD
sz;
BYTE
data[sz];
}
base64({
Part1,Part2,Crc32
})
.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
.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
.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
.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
from
Crypto.Util.number
import
*
print
(
'dw1:'
,
hex
(inverse(
0x7d45
,
0x346F8717
)))
print
(
'dw2:'
,
hex
(inverse(
0XD711
,
0X729969FF
)))
from
Crypto.Util.number
import
*
print
(
'dw1:'
,
hex
(inverse(
0x7d45
,
0x346F8717
)))
print
(
'dw2:'
,
hex
(inverse(
0XD711
,
0X729969FF
)))
.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 ;异或
.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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)