-
-
[原创] KCTF2020 秋季赛 第七题 鱼目混珠
-
发表于: 2020-12-15 00:23 6760
-
作者写了好多花指令,包括\x70
~\x7F
的跳转都用了,震惊。。写个脚本把用到的花都去掉。
然后F5,顺着main函数看。
先是一系列函数指针。前面几个都是反调试,后面的是check_sum
然后对输入的前7字节,后最后7字节进行了一个验证。因为有点麻烦,我这里先没看,直接patch没了。
后面的内容,调试一下,可以看出,作者是写了个大数结构。
然后运算和赋值大概长这个样子
整理一下运算。以为最后是比较R1和str1。。所以以为后面的R3运算没用了。。后面调试发现坑点在于,操作可能会溢出,而R3和str1挨着,所以R3运算可能会溢出搞掉str1。会导致str1的大数结构的长度变1,导致sstr1瞬间变成1.
写个脚本,并且微调一下。发现算术上check是可以通过的,为什么flag不对呢。。
然后想起来开局一堆反调试被我patch了,可后面已经通过check了,前面反调试验证前7后7有啥用呢。然后意识到可能是大小写。把答案改成大写OK了,所以前面是为了防止多解吧。
func_ptr[
0
]
=
sub_401700;
func_ptr[
1
]
=
sub_401740;
func_ptr[
2
]
=
sub_4017B0;
func_ptr[
3
]
=
sub_401890;
func_ptr[
4
]
=
sub_4018F0;
func_ptr[
5
]
=
sub_401570;
func_ptr[
6
]
=
sub_401820;
func_ptr[
7
]
=
sub_401950;
func_ptr[
8
]
=
sub_401AB0;
func_ptr[
9
]
=
check_sum_main;
/
/
算main函数是否被patch
func_ptr[
10
]
=
check_sum_anti_debug;
/
/
算anti
-
debug函数是否被patch
func_ptr[
11
]
=
sub_401620;
func_ptr[
0
]
=
sub_401700;
func_ptr[
1
]
=
sub_401740;
func_ptr[
2
]
=
sub_4017B0;
func_ptr[
3
]
=
sub_401890;
func_ptr[
4
]
=
sub_4018F0;
func_ptr[
5
]
=
sub_401570;
func_ptr[
6
]
=
sub_401820;
func_ptr[
7
]
=
sub_401950;
func_ptr[
8
]
=
sub_401AB0;
func_ptr[
9
]
=
check_sum_main;
/
/
算main函数是否被patch
func_ptr[
10
]
=
check_sum_anti_debug;
/
/
算anti
-
debug函数是否被patch
func_ptr[
11
]
=
sub_401620;
struct bg{
int
len
;
/
/
大数的长度
char num[
32
];
/
/
大数每一位的值
};
struct bg{
int
len
;
/
/
大数的长度
char num[
32
];
/
/
大数每一位的值
};
R1_data[
4
]
=
0
;
*
R1_data
=
*
str1_data;
/
/
给大数的data部分赋值
v15
=
4
;
while
(
1
)
/
/
这段
while
算大数的长度
v16
=
v15
-
1
;
if
( R1_data[v15
-
1
] )
break
;
-
-
v15;
if
( !v16 )
goto LABEL_29;
}
v16
=
v15;
LABEL_29:
R1.
len
=
v16;
/
/
把长度赋好
mul(&R0, &R2.
len
, &R1.
len
);
/
/
运算,R1和R2的相乘,赋值给R0
R1_data[
4
]
=
0
;
*
R1_data
=
*
str1_data;
/
/
给大数的data部分赋值
v15
=
4
;
while
(
1
)
/
/
这段
while
算大数的长度
v16
=
v15
-
1
;
if
( R1_data[v15
-
1
] )
break
;
-
-
v15;
if
( !v16 )
goto LABEL_29;
}
v16
=
v15;
LABEL_29:
R1.
len
=
v16;
/
/
把长度赋好
mul(&R0, &R2.
len
, &R1.
len
);
/
/
运算,R1和R2的相乘,赋值给R0
# 内存排布 R2, R1, R0, R3, str1, str2
R2
=
inp
R1
=
0x10010401
R0
=
R1
*
R2
R2
=
0x0E053D0F
R0
/
=
R2
R0
+
=
str1
R0
+
=
str2
R3
=
str1
*
str2
R1
=
R0
-
R3
# overflow to...str1
R0
*
=
R2
R3
=
R0
*
37
R3
+
=
R3
R1
=
=
str1 ?
# 内存排布 R2, R1, R0, R3, str1, str2
R2
=
inp
R1
=
0x10010401
R0
=
R1
*
R2
R2
=
0x0E053D0F
R0
/
=
R2
R0
+
=
str1
R0
+
=
str2
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: