首页
社区
课程
招聘
1
[分享]第6题 RePWN
发表于: 2019-3-14 13:55 5890

[分享]第6题 RePWN

2019-3-14 13:55
5890

试探程序

随意输入brucy1998416,得到输出
图片描述
IDA载入,搜索关键字符串,定位到关键函数

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
int __thiscall check1(void *this)
{
  unsigned int v1; // ebx
  char *Str; // [esp+0h] [ebp-68h]
  char v4[4]; // [esp+10h] [ebp-58h]
  int v5; // [esp+20h] [ebp-48h]
  int v6; // [esp+24h] [ebp-44h]
  int v7; // [esp+28h] [ebp-40h]
  int v8; // [esp+2Ch] [ebp-3Ch]
  int v9; // [esp+30h] [ebp-38h]
  int v10; // [esp+34h] [ebp-34h]
  int v11; // [esp+38h] [ebp-30h]
  int v12; // [esp+3Ch] [ebp-2Ch]
  char input; // [esp+40h] [ebp-28h]
 
  sub_404930(0x10u, this, Str);
  sub_4044B0();
  v1 = 0;
  v5 = 'yt^';
  v6 = '+pLc';
  v7 = 'a+SG';
  v8 = 'G-QG';
  v9 = 'Gl(V';
  v10 = ')y}J';
  v11 = 'SGA)';
  v12 = 'ea+';
  strcpy(v4, "Ansome_Is_Wrong");
  while ( v1 < strlen(&v5) )
    *(&v5 + v1++) ^= 0x18u;
  puts("Please Input Your Key_ Now!");
  scanf("%s", &input);
  if ( check2(&input) )
  {
    check3(&input);
    system("pause");
  }
  else
  {
    puts(v4);
  }
  return 0;
}

动态调试发现v5解密出来的数据为Flag{Th3_K3y_I5_N0t_Rea11Y_K3y},这在后面的分析中没看到有什么用,算是个彩蛋吧。

分析check2函数

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
signed int __cdecl sub_4012F0(int a1)
{
  signed int v1; // ecx
  signed int v2; // edx
  signed int result; // eax
  int v4; // [esp+0h] [ebp-38h]
  int v5; // [esp+4h] [ebp-34h]
  int v6; // [esp+8h] [ebp-30h]
  char v7; // [esp+Ch] [ebp-2Ch]
  int v8; // [esp+10h] [ebp-28h]
  int v9; // [esp+14h] [ebp-24h]
  int v10; // [esp+18h] [ebp-20h]
  int v11; // [esp+1Ch] [ebp-1Ch]
  int v12; // [esp+20h] [ebp-18h]
 
  v1 = 8;
  v2 = 0;
  v8 = 'ruoY';
  v9 = 'pnI_';
  v10 = 'I_tu';
  v11 = 'rW_s';
  v12 = 'gno';
  v4 = '0Y1X';
  v5 = 't3Nu';
  v6 = 'd00G';
  v7 = 0;
  while ( *(&v4 + v2) == *(v1 + a1) )
  {
    ++v2;
    ++v1;
    if ( v2 > 11 )
    {
      result = 1;
      if ( *(a1 + 20) == 0x48 )//作者最后一次修改的时候加上去的,之前并没有
        return result;
      return 0;
    }
  }
  return 0;
}

check2函数要求输入的字符串中从第8位开始到第20位要与“X1Y0uN3tG00d”相等,并且第21位字符为‘H’

分析check3函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int __cdecl check3(char *Str)
{
  char Dest; // [esp+8h] [ebp-10h]
 
  if ( strlen(Str) == 24 )
  {
    if ( check4(Str) )
    {
      Str[20] -= 88;
      Str[21] -= 70;
      Str[22] -= 3;
      Str[23] -= 107;
      strcpy(&Dest, Str);
    }
  }
  else
  {
    printf("String Length is Wrong");
  }
  return 0;
}

要求输入的字符串长度是24位,跟进check4看看

分析check4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
signed int __cdecl sub_4013B0(int a1)
{
  int v1; // ebx
  int v2; // ecx
  int v3; // esi
  signed int result; // eax
 
  CharToInt(a1);
  v1 = input3 + 1000 * input0[0] + 100 * input1 + 10 * input2;
  v2 = input5 + 10 * input4;
  v3 = input7 + 10 * input6;
  if ( 2 * (v1 + v2) != 4040 || 3 * v2 / 2 + 100 * v3 != 115 )
    goto LABEL_2;
  result = 1;
  if ( v1 - 110 * v3 != 1900 )
  {
    printf("Key_Is_Wrong,Please_Input_Again!");
LABEL_2:
    result = 0;
  }
  return result;
}

可以看出,两个if语句表示着一个三元一次方程组:

2 (v1 + v2) = 4040
3
v2 / 2 + 100 v3 = 115
v1 - 110
v3 = 1900
解之得
[v2 = 10, v3 = 1, v1 = 2010]

 

CharToInt函数是将输入的数据前8位依次减去48,保存在input数组里。
根据解得的v2,v3,v1可以逆推出输入的前8位数据为“20101001”
现在回到check3中

回顾check3函数

Str[20] -= 88;
Str[21] -= 70;
Str[22] -= 3;
Str[23] -= 107;
strcpy(&Dest, Str);

 

这里是对输入的后4位进行处理,然后很诡异的一个地方就是最后用了一个 strcpy(&Dest, Str);

吐槽一下

到此就不得不吐槽一下,这道题目已经修改了两次。我是在他修改的第一次后开始做的,当时没明白这里有什么用,随意输入1234凑足24位。即将“20101001X1Y0uN3tG00d1234”作为输入,程序没有错误提示,且正常退出,然后提交答案却说错误。过了一段时间提示题目更新,修正多解bug。

回到正题

拿到最后更新的题目,也就是上面给出的代码。当再将“20101001X1Y0uN3tG00dH234”作为输入发现程序崩溃了。


[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

最后于 2019-3-25 13:33 被kanxue编辑 ,原因:
收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2023-1-29 01:26
最新回复 (2)
雪    币: 1258
活跃值: (46)
能力值: ( LV3,RANK:22 )
在线值:
发帖
回帖
粉丝
2
我就卡在字符串后三位"aCk"这里死活过不去
2019-3-25 22:04
0
雪    币: 3985
活跃值: (64)
能力值: ( LV4,RANK:41 )
在线值:
发帖
回帖
粉丝
3
我是没看清大规则,flag只允许数字和字母
结果我得到了个200:1001X1Y0uN3tG00dHaCk;
后面没识别DES,Input2没逆出来,顺着对4085B0跟了几轮就晕了,只是根据最后的比较,推出是个8为的字符串
看结果好多只要做出Input1就能过,还有这操作
2019-3-26 10:06
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册