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

[原创] 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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//