首页
社区
课程
招聘
[原创] KCTF2020 秋季赛 第七题 鱼目混珠
2020-12-15 00:23 6099

[原创] KCTF2020 秋季赛 第七题 鱼目混珠

2020-12-15 00:23
6099

作者写了好多花指令,包括\x70~\x7F的跳转都用了,震惊。。写个脚本把用到的花都去掉。

 

然后F5,顺着main函数看。

 

先是一系列函数指针。前面几个都是反调试,后面的是check_sum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;

然后对输入的前7字节,后最后7字节进行了一个验证。因为有点麻烦,我这里先没看,直接patch没了。

 

后面的内容,调试一下,可以看出,作者是写了个大数结构。

1
2
3
4
struct bg{
    int len; // 大数的长度
    char num[32]; // 大数每一位的值
};

然后运算和赋值大概长这个样子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  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和str1。。所以以为后面的R3运算没用了。。后面调试发现坑点在于,操作可能会溢出,而R3和str1挨着,所以R3运算可能会溢出搞掉str1。会导致str1的大数结构的长度变1,导致sstr1瞬间变成1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 内存排布 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 ?

写个脚本,并且微调一下。发现算术上check是可以通过的,为什么flag不对呢。。

 

然后想起来开局一堆反调试被我patch了,可后面已经通过check了,前面反调试验证前7后7有啥用呢。然后意识到可能是大小写。把答案改成大写OK了,所以前面是为了防止多解吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# input: 5567890123456789, low -> high
# store: 0x55, 0x76, 0x90, 0x10, 0x32, 0x54, 0x76, 0x98
# means: 0x9876543210987655
# a...zhe...
 
'''
R0 = inp * 0x10010401 / 0xE053D0F + (str1 + str2)
R1 = R0 - str1 * str2
R3 = R0 * 37  * 2 / 0xE053D0F
 
R1 == str1(overflow)
 
inp * 0x10010401 / 0xE053D0F + str1 + str2 - str1 * str2 == 1
 
'''
 
str1 = 0x3FAFFA2B01B6BA9744C4B4E010010401
str2 = 0xFEA1BD9E6964129D8F5079E1
str1_over = 1
#r = (str1 * str2 - str1 - str2 + str1_over) * 0xE053D0F / 0x10010401
r = (str1 * str2 - str1 - str2 + str1_over + 1) * 0xE053D0F / 0x10010401
print hex(r)
R0 = r * 0x10010401
print hex(R0)
R0 = R0 / 0xE053D0F
print hex(R0)
R0 = R0 + str1 + str2
print hex(R0)
R3 = str1 * str2
print hex(R3)
R1 = R0 - R3
print R1 # 1
 
R0 = R0 * 0xE053D0F
print hex(R0)
R3 = R0 * 37
print hex(R3) #...
 
'''
PS C:\ctf\132_KCTF_q3\problem-7> .\lelfei-KCTF2020.exe
INPUT:10C7F30833B9C4563BF035C32D8C7709E040FCA64E211F34CD3FE773
GOOD!
'''

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回