首页
社区
课程
招聘
[分享]2022KCTF秋季赛第六题,初学者从0跟着学习,感谢各位大神
2022-12-8 12:06 10231

[分享]2022KCTF秋季赛第六题,初学者从0跟着学习,感谢各位大神

2022-12-8 12:06
10231

借鉴了两篇文章,非常感谢,学习win逆向
https://bbs.pediy.com/thread-275344.htm
https://bbs.pediy.com/thread-275326.htm

1.先静态分析

通过搜索字符串定位到关键函数,然后静态分析内部:

1.1取出前五字节数值的过程

图片描述
图片描述

1.2取出中间四字节数值的过程,后续与KCTF比较

图片描述
图片描述
图片描述

1.3取出后五字节数值的过程(步骤类似1.2)

图片描述
图片描述

1.4前五字节转换为int值作随机因子产生随机数,与目标1循环进行比较

图片描述
图片描述
图片描述

1.5 后五字节转换为int值作随机因子产生随机数,与目标2循环进行比较

图片描述
图片描述
图片描述

 

现在只需要找出目标1:&unk_40F000 和目标2:&unk_40F050 即可利用爆破解出随机因子了,即前五字节和后五字节(中间四字节为KCTF)

2.动态调试

步骤参考:IDA动态调试exe文件
图片描述
图片描述

3.爆破代码

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 全局变量
static unsigned int _getptd_20 = 0;
 
 
// 自定义srand函数,传入随机因子
void self_srand(unsigned int Seed)
{
  _getptd_20 = Seed;
}
 
 
// 自定义随即函数
int self_rand()
{
  unsigned int v1; // eax
  v1 = 214013 * _getptd_20 + 2531011;
  _getptd_20 = v1;
  return (v1 >> 16) & 0x7FFF//HIWORD(v1) & 0x7FFF;
}
 
 
 
int baopo(const int *arr){
    int seed = 0;
    while(1){
        // 次数每个新种子时要清零
        int succ_time =0;
        // 设置随机因子
        self_srand(seed);
        // 比较所有的数组是否一样:self_rand()种子一样 + 调用次数一样=====》self_rand()结果一致
        int temp;
        for(int i = 0;i < 20;i++){
            if((temp =self_rand()) != arr[i]){
                break;
            }else{
                succ_time++;
            }
        }
 
        // 说明self_rand,连续20次生成的值都与目标一致,说明结果找到了;此步骤防止最后一次成功,其他值却不成功的现象!
        if(succ_time == 20){
            break;
        }else{
            seed++;
        }
 
    }
 
    return seed;
}
 
 
 
int main(int argc, char const *argv[])
{
    int arr1[] = {0x3BFC,0x2173,0x25BB,0x380B,0x2C13,0x75BE,0x7366,0x46A3,0x13C1,0x159B,0x5B5F,0x534F,0x4E37,0x3A04,0x1301,0x5D0C,0x4155,0x48E9,0x61D2,0x6158};
    int arr2[] = {0x2BB6,0x6B5A,0x03D4,0x152B,0x6E04,0x254C,0x40AE,0x56CA,0x17E1,0x55C7,0x3641,0x2D3C,0x0A41,0x4BC5,0x6233,0x1FE7,0x6E05,0x0F6E,0x6398,0x6AD7};
 
    int = baopo(arr1);
    int = baopo(arr2);
 
    char str1[256];
    char str2[256];
    sprintf(str1,"%d",a);//将整数a写入到字符串中
    sprintf(str2,"%d",b);//将整数b写入到字符串中
    printf("前五个的字符串为:%s\n",str1);
    printf("后五个的字符串为:%s\n",str2);
    printf("最终结果为:%dKCTF%d\n", a, b);
    // printf("%d\n", a);
 
    return 0;
}

4.结果

图片描述

5.感谢

感谢各位大佬的逆向文档,这题虽然很简单,对于初入逆向的很有帮助,不断学习。也恳求大佬写文章时能浅显一点,照顾一下我们初学菜鸟(非常感谢大佬们)


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2022-12-30 20:09 被kanxue编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回