首页
社区
课程
招聘
[原创]第四题 英雄救美
2021-5-25 16:33 7788

[原创]第四题 英雄救美

2021-5-25 16:33
7788

一丢进 IDA 可以发现符号表 暗示着这题有点难

 

图片描述

 

猜测 sub_401240 和 sub_401000 为两个 check 函数

 

图片描述

 

想要继续往下走 也就是 sub_401240 和 sub_401000 返回值都要为 1

 

先分析分析前面那个

 

图片描述

 

可以看出这是一个 fill 函数

 

所做的只是将输入转换为在 table 中的 index

 

并提供给下一个 check 函数使用

 

值得注意的是传给 check 函数的参数

if ( len <= 64 && fill(len, input, v10) == 1 && check(v10, len - 9) == 1 )

 

len 少了 9

 

意味着有 9 位输入被截取掉了

 

而再仔细回头看 fill 函数可以发现

 

若输入的是数字 并不会储存起来

 

而是跳过并且更改所比较的 table 的起始 index

 

再看看 check 函数

 

图片描述

 

着一大部分都是将 fill 的结果填入一个表中 若被填的那一位为0 则填入

 

按照一个循环里9次判断,总共9次循环 将map划分为这样

 

图片描述

 

按照经验来看的话很像是数独 用在线网站解一下

 

图片描述

 

正好有解 应该还是唯一解

 

那这就出了撒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
unsigned char table[] = { 0x24, 0x42, 0x50, 0x56, 0x3A, 0x75, 0x62, 0x66, 0x59, 0x70, 0x7D, 0x5D, 0x44, 0x74, 0x4E, 0x3E, 0x61, 0x54, 0x5E, 0x4D, 0x47, 0x6D, 0x4A, 0x51, 0x23, 0x2A, 0x48, 0x72, 0x60, 0x4F, 0x27, 0x77, 0x6A, 0x69, 0x63, 0x30, 0x21, 0x68, 0x64, 0x79, 0x7B, 0x6F, 0x5A, 0x7A, 0x2D, 0x40, 0x6E, 0x2B, 0x3F, 0x26, 0x25, 0x73, 0x5F, 0x2F, 0x67, 0x3C, 0x65, 0x5B, 0x57, 0x29, 0x58, 0x55, 0x78, 0x52, 0x46, 0x53, 0x4C, 0x52, 0x41, 0x3B, 0x2E, 0x6C, 0x3D, 0x43, 0x45, 0x6B, 0x76, 0x4B, 0x2D, 0x28, 0x71};
const char* path = "5619238\n18345\n76219\n7846925\n4539786\n6928713\n28563\n61728\n1793452\n";
 
int main()
{
    int x = 0;
    int y = 0;
    for (int i = 0; path[i]; ++i)
        if (path[i] != '\n')
        {
            printf("%c", table[ y * 9 + path[i] - '0' - 1 ]);
            x++;
        }
        else
        {
            printf("%d", 9 - x);
            x = 0;
            y++;
        }
    putchar('\n');
}

验证成功

 

图片描述

:u$YBPf2pa]Dt4#QM^H4ic'j0`w2y{d-Zzo2%/n_s@+2<UW)e4AR;F.4=-qEkvC2


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

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