[buuctf][2019红帽杯]easyRE

[2019红帽杯]easyRE

解析

先查一下,是一个64位无壳文件,elf文件,之后拖入ida中进行查看,发现并没什么有什么如约而至的main函数,那么我们只能自己寻找,直接来寻找字符串发现了一个base64加密的,还有base64的密文,过于着急去解密,之后被骗去了看雪https://bbs.pediy.com/thread-254172.htm这个页面,之后重新分析的
![在这里插入图片描述](https://img-blog.csdnimg.cn/f03184a8f8a04a3491a4d342a454b751.png
在这里插入图片描述

在这里,从这里跳进去进行反编译。

__int64 sub_400D35()
{
  __int64 v0; // rdi
  __int64 result; // rax
  unsigned __int64 v2; // rt1
  unsigned int v3; // [rsp+Ch] [rbp-24h]
  signed int i; // [rsp+10h] [rbp-20h]
  signed int j; // [rsp+14h] [rbp-1Ch]
  unsigned int v6; // [rsp+24h] [rbp-Ch]
  unsigned __int64 v7; // [rsp+28h] [rbp-8h]

  v7 = __readfsqword(0x28u);
  v0 = 0LL;
  v3 = sub_43FD20(0LL) - qword_6CEE38;
  for ( i = 0; i <= 1233; ++i )
  {
    v0 = v3;
    sub_40F790(v3);
    sub_40FE60();
    sub_40FE60();
    v3 = (unsigned __int64)sub_40FE60() ^ 0x98765432;
  }
  v6 = v3;
  if ( ((unsigned __int8)v3 ^ byte_6CC0A0[0]) == 0x66 && (HIBYTE(v6) ^ (unsigned __int8)byte_6CC0A3) == 0x67 )
  {
    for ( j = 0; j <= 24; ++j )
    {
      v0 = (unsigned __int8)(byte_6CC0A0[j] ^ *((_BYTE *)&v6 + j % 4));
      sub_410E90(v0);
    }
  }
  v2 = __readfsqword(0x28u);
  result = v2 ^ v7;
  if ( v2 != v7 )
    sub_444020(v0);
  return result;
}

发现这里的信息,之后看一下字符,0x66是f,0x67g,那么就是证明这里要是flag,之后写一下脚本进行反推出来v6是多少,之后在继续往下,之后在继续异或,之后可以开始写了。

脚本

开始往下走,先知道v6是多少,要先知道byte_6CC0A0和byte_6CC0A3,之后列出来。

.data:00000000006CC0A0 byte_6CC0A0     db 40h                  ; DATA XREF: sub_400D35+95↑r
.data:00000000006CC0A0                                         ; sub_400D35+C1↑r
.data:00000000006CC0A1                 db  35h ; 5
.data:00000000006CC0A2                 db  20h
.data:00000000006CC0A3 byte_6CC0A3     db 56h                  ; DATA XREF: sub_400D35+A6↑r
.data:00000000006CC0A4                 db  5Dh ; ]
.data:00000000006CC0A5                 db  18h
.data:00000000006CC0A6                 db  22h ; "
.data:00000000006CC0A7                 db  45h ; E
.data:00000000006CC0A8                 db  17h
.data:00000000006CC0A9                 db  2Fh ; /
.data:00000000006CC0AA                 db  24h ; $
.data:00000000006CC0AB                 db  6Eh ; n
.data:00000000006CC0AC                 db  62h ; b
.data:00000000006CC0AD                 db  3Ch ; <
.data:00000000006CC0AE                 db  27h ; '
.data:00000000006CC0AF                 db  54h ; T
.data:00000000006CC0B0                 db  48h ; H
.data:00000000006CC0B1                 db  6Ch ; l
.data:00000000006CC0B2                 db  24h ; $
.data:00000000006CC0B3                 db  6Eh ; n
.data:00000000006CC0B4                 db  72h ; r
.data:00000000006CC0B5                 db  3Ch ; <
.data:00000000006CC0B6                 db  32h ; 2
.data:00000000006CC0B7                 db  45h ; E
.data:00000000006CC0B8                 db  5Bh ; [

之后一个脚本进行计算,最后获得flag是flag{Act1ve_Defen5e_Test}。

#include<stdio.h>
int byte_6CC0A0_3[4] = { 0x40,0x35 ,0x20 ,0x56};
int byte_6CC0A0[25] = { 0x40,0x35 ,0x20 ,0x56 ,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B };
int v1[4] = { 0x66,0x6c,0x61,0x67 };
char v3[4] = { 0 };
char v0[25] = { 0 };
int main() {
	for (int i = 0; i < 4; i++) {
		v3[i] = byte_6CC0A0_3[i] ^ v1[i];
	}
	for (int j = 0; j <= 24; j++) {
		v0[j] = byte_6CC0A0[j] ^ v3[j % 4];
	}
	printf("%s", v0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆向萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值