首页
社区
课程
招聘
[原创] 看雪 2023 KCTF 年度赛 第一题 失控的AI
2023-9-2 12:25 3993

[原创] 看雪 2023 KCTF 年度赛 第一题 失控的AI

2023-9-2 12:25
3993
1
2
3
4
5
6
7
8
9
C:\>py
Python 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in range(117738):
...     if i * (117738-i) == 3457897337:
...         print(i, 117738-i)
...
56101 61637
61637 56101
1
2
3
C:\>KanXueCTF_Simple.exe
Please input: 56101-61637
Accepted!

虚假的签到题:生死较量 (writeup)
真实的签到题:失控的AI

IDA反编译,直达main函数

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 v3; // rbx
  int v4; // ebp
  __int64 v5; // rdi
  int v6; // eax
  __int64 v7; // rsi
  int v8; // edi
  __int64 v9; // rax
  int v10; // eax
  const char *v11; // rcx
  __int64 v13; // [rsp+30h] [rbp-48h] BYREF
  __int64 v14; // [rsp+38h] [rbp-40h] BYREF
  char v15[8]; // [rsp+40h] [rbp-38h] BYREF
  int v16; // [rsp+48h] [rbp-30h]
  char v17; // [rsp+4Ch] [rbp-2Ch]
  char Buffer[8]; // [rsp+50h] [rbp-28h] BYREF
  int v19; // [rsp+58h] [rbp-20h]
  char v20; // [rsp+5Ch] [rbp-1Ch]
 
  v3 = 0i64;
  *(_QWORD *)v15 = 0i64;
  v13 = 0i64;
  v14 = 0i64;
  v16 = 0;
  v17 = 0;
  *(_QWORD *)Buffer = 0i64;
  v19 = 0;
  v20 = 0;
  sub_140001020((int)"Please input: ", argv, envp);
  v4 = 0;
  v5 = 0i64;
  while ( 1 )
  {
    v6 = fgetchar();
    if ( v6 == 10 )
      break;
    v7 = v5 + 1;
    v15[v5] = v6;
    if ( (unsigned __int64)(v5 + 1) >= 0xD )
      goto LABEL_29;
    v15[v7] = 0;
    if ( v5 == 11 && fgetchar() != 10 )
      goto LABEL_27;
    ++v4;
    ++v5;
    if ( v7 >= 12 )
      goto LABEL_10;
  }
  if ( (unsigned __int64)v4 >= 0xD )
  {
LABEL_29:
    _report_rangecheckfailure();
    JUMPOUT(0x1400012FBi64);
  }
  v15[v4] = 0;
LABEL_10:
  v8 = 0;
  if ( v15[0] )
  {
    v9 = 0i64;
    while ( 1 )
    {
      ++v8;
      if ( ++v9 > 12 )
        break;
      if ( !v15[v9] )
        goto LABEL_16;
    }
    v8 = -1;
  }
LABEL_16:
  if ( sub_1400010E0(v15, "%lld-%lld", &v13, &v14) == 2 )
  {
    v10 = sub_140001080(Buffer, 0xDui64, "%lld-%lld");
    if ( v8 > 0 && v10 > 0 && v8 == v10 )
    {
      while ( v15[v3] == Buffer[v3] )
      {
        if ( ++v3 >= v8 )
        {
          if ( v13 > 0 && v14 > 0 && v13 <= v14 && v14 + v13 == 117738 )
          {
            v11 = "Accepted!\n";
            if ( v13 * v14 == 3457897337i64 )
              goto LABEL_28;
          }
          break;
        }
      }
    }
  }
LABEL_27:
  v11 = "Wrong answer!\n";
LABEL_28:
  sub_140001020((int)v11);
  return 0;
}

31行printf,44行检查'\n',34-50行循环read line
51行检查输入长度
74行scanf,76行sprintf,提示输入格式为两个整数中间以'-'分隔
83行,两数之和为 117738,且较小数在前;87行,两数之积为 3457897337

求解,得到 56101 和 61637,组合为答案:56101-61637

(暴力枚举比解方程快多了)


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

收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 202
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_wghpvopz 2023-9-19 10:47
2
0

师傅想问下这个是直接F5出来的吗?为啥我的IDA7.7只有88行,LABEL_16也没哪两个值啊,是版本问题还是有什么其他操作啊。

雪    币: 1760
活跃值: (2349)
能力值: ( LV12,RANK:234 )
在线值:
发帖
回帖
粉丝
wx_孤城 2023-9-20 15:34
3
0
mb_wghpvopz 师傅想问下这个是直接F5出来的吗?为啥我的IDA7.7只有88行,LABEL_16也没哪两个值啊,是版本问题还是有什么其他操作啊。
IDA识别不是很精准的,可以对函数右键, 设置下函数参数个数
游客
登录 | 注册 方可回帖
返回