首页
社区
课程
招聘
[原创]BUUCTF逆向题:[FlareOn4]IgniteMe
2022-3-25 00:21 5121

[原创]BUUCTF逆向题:[FlareOn4]IgniteMe

2022-3-25 00:21
5121

1.基本信息探查:

1.EXEinfo:

32位,无壳

 

image-20220324232923548

2.运行一下:

image-20220324233009665

2.IDA分析:

1.主函数分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __noreturn start()
{
  DWORD NumberOfBytesWritten; // [esp+0h] [ebp-4h] BYREF
 
  NumberOfBytesWritten = 0;
  hFile = GetStdHandle(0xFFFFFFF6);
  dword_403074 = GetStdHandle(0xFFFFFFF5);
  WriteFile(dword_403074, aG1v3M3T3hFl4g, 0x13u, &NumberOfBytesWritten, 0);// 输出“G1v3 m3 t3h fl4g:”
  sub_4010F0(NumberOfBytesWritten);
  if ( sub_401050() )
    WriteFile(dword_403074, aG00dJ0b, 0xAu, &NumberOfBytesWritten, 0);// 输出“G00d j0b!”
  else
    WriteFile(dword_403074, aN0tT00H0tRWe7r, 0x24u, &NumberOfBytesWritten, 0);// 输出“N0t t00 h0t R we? 7ry 4ga1nz plzzz!”
  ExitProcess(0);
}

WriteFile其实就相当于输出语句,那么我们要分析的地方就是两个函数,一个是sub_4010F0,一个是sub_401050

2.sub_4010F0()函数分析:

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
int sub_4010F0()
{
  unsigned int v0; // eax
  char Buffer[260]; // [esp+0h] [ebp-110h] BYREF
  DWORD NumberOfBytesRead; // [esp+104h] [ebp-Ch] BYREF
  unsigned int i; // [esp+108h] [ebp-8h]
  char v5; // [esp+10Fh] [ebp-1h]
 
  v5 = 0;
  for ( i = 0; i < 0x104; ++i )
    Buffer[i] = 0;                              // 初始化Buffer变量
  ReadFile(hFile, Buffer, 0x104u, &NumberOfBytesRead, 0);// 读取字符串,并放入Buffer变量
  for ( i = 0; ; ++i )                          // 循环遍历Buffer
  {
    v0 = sub_401020((int)Buffer);               // 这个函数相当于Strlen
    if ( i >= v0 )
      break;
    v5 = Buffer[i];                             // v5存的是Buffer的i偏移的值
    if ( v5 != 10 && v5 != 13 )                 // v5不等于换行或回车
    {
      if ( v5 )
        byte_403078[i] = v5;                    // 最终存在了byte_403078的地址里
    }
  }
  return 1;
}

这个函数就是去除掉输入字串的换行和回车

3.sub_401050()函数分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int sub_401050()
{
  int v1; // [esp+0h] [ebp-Ch]
  int i; // [esp+4h] [ebp-8h]
  unsigned int j; // [esp+4h] [ebp-8h]
  char v4; // [esp+Bh] [ebp-1h]
 
  v1 = sub_401020((int)byte_403078);
  v4 = sub_401000();
  for ( i = v1 - 1; i >= 0; --i )
  {
    byte_403180[i] = v4 ^ byte_403078[i];
    v4 = byte_403078[i];
  }
  for ( j = 0; j < 0x27; ++j )
  {
    if ( byte_403180[j] != (unsigned __int8)byte_403000[j] )
      return 0;
  }
  return 1;
}

这个函数就是加密函数了,咱一条一条语句来:

  • 先看v1的赋值sub_401020()函数之前就分析过相当于strlen,所以v1存放输入字串的串长
  • v4调用函数做了个循环右移的运算这里图方便直接动调查看里面的值,值为4
    image-20220325000755404
  • 注意这里的循环是从后往前取值
  • 接着就是异或操作,这里注意之后v4的值就变成了输入字串的i偏移的值
  • 下面这个for就是循环判断异或后的值是否与byte_403000的值相等了

3.EXP编写:

先提取处byte_403000处的值
image-20220325001239015

1
0D2649452A1778442B6C5D5E45122F172B446F6E56095F454773260A0D1317484201404D0C026900

最后exp为:

1
2
3
4
5
6
7
8
9
rflag = [0x0D,0x26,0x49, 0x45, 0x2A, 0x17, 0x78, 0x44, 0x2B, 0x6C, 0x5D,0x5E, 0x45, 0x12, 0x2F, 0x17, 0x2B, 0x44, 0x6F, 0x6E, 0x56, 0x9,0x5F, 0x45, 0x47, 0x73, 0x26, 0x0A, 0x0D, 0x13, 0x17, 0x48, 0x42,0x1, 0x40, 0x4D, 0x0C, 0x2, 0x69, 0x0]
flag = ""
rflag_len = len(rflag)-1
for i in range(len(rflag)):
    if i==0:
       rflag[rflag_len - i] = rflag[rflag_len - i] ^ 0x4
    rflag[rflag_len - i - 1] = rflag[rflag_len - i - 1] ^ rflag[rflag_len - i]
    flag += chr(rflag[rflag_len - i])
print(flag[::-1])

image-20220325001744448

 

flag{R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2022-3-27 16:12 被宇宙大魔王编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回