Buuctf SimpleRev WP

1.查壳


在这里插入图片描述

无壳,为64bit 的ELF文件

2.IDA分析


拖入IDA64中,Shift+F12查看字符串

在这里插入图片描述

找到可用信息,双击进入后选中Ctrl+X交叉引用

在这里插入图片描述

OK进入后按F5查看伪代码

伪代码如下:

unsigned __int64 Decry()
{
  char v1; // [rsp+Fh] [rbp-51h]
  int v2; // [rsp+10h] [rbp-50h]
  int v3; // [rsp+14h] [rbp-4Ch]
  int i; // [rsp+18h] [rbp-48h]
  int v5; // [rsp+1Ch] [rbp-44h]
  char src[8]; // [rsp+20h] [rbp-40h] BYREF
  __int64 v7; // [rsp+28h] [rbp-38h]
  int v8; // [rsp+30h] [rbp-30h]
  __int64 v9[2]; // [rsp+40h] [rbp-20h] BYREF
  int v10; // [rsp+50h] [rbp-10h]
  unsigned __int64 v11; // [rsp+58h] [rbp-8h]

  v11 = __readfsqword(0x28u);
  *(_QWORD *)src = 'SLCDN';
  v7 = 0LL;
  v8 = 0;
  v9[0] = 'wodah';
  v9[1] = '\0';
  v10 = 0;
  text = join(key3, (const char *)v9);
  strcpy(key, key1);
  strcat(key, src);
  v2 = 0;
  v3 = 0;
  getchar();
  v5 = strlen(key);
  for ( i = 0; i < v5; ++i )
  {
    if ( key[v3 % v5] > '@' && key[v3 % v5] <= 'Z' )
      key[i] = key[v3 % v5] + 32;
    ++v3;
  }
  printf("Please input your flag:");
  while ( 1 )
  {
    v1 = getchar();
    if ( v1 == '\n' )
      break;
    if ( v1 == ' ' )
    {
      ++v2;
    }
    else
    {
      if ( v1 <= '`' || v1 > 'z' )              // 输入的不是小写,
      {
        if ( v1 > '@' && v1 <= 'Z' )
        {
          str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
          ++v3;
        }
      }
      else                                      // 输入的是小写。
      {
        str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
        ++v3;
      }
      if ( !(v3 % v5) )
        putchar(32);
      ++v2;
    }
  }
  if ( !strcmp(text, str2) )
    puts("Congratulation!\n");
  else
    puts("Try again!\n");
  return __readfsqword(0x28u) ^ v11;
}

从下往上分析,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以推测 str2和text比较返回0时,成功。

往上看从while开始,是根据getchar的数据对str2进行处理;

再往上看,for循环是对key数组进行处理。

key是由strcpy将key1的值复制给key,再用strcat将src的值加到key后面;text则是用jion函数将key3和v9结合起来,具体双击jion函数查看:

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ff1ab875a-f9e9-4425-9e40-
在这里插入图片描述
在这里插入图片描述

所以:

src = ‘SLCDN’;v9[0] = ‘wodah’;

key1 = ‘ADSFK’; key3 = ‘kills’;

3.大小端序存储


这里的src和v9都涉及了大小端序的存储。什么是大小端序?

大端序存储:低字节存放在高字节,高字节存放在低字节;

小端序存储:低字节存放在低字节,高字节存放在高字节;

一般在内存中数据的存储是按照小端序的方式进行存储的。

选中v9,按H快捷键换成十六进制,可以看到v9[0] = 0x776F646168LL;

从左往右读,左边是高字节,我们可以知道, ‘w’ = 0x77 ; ‘o’ = 0x6f ….

这里要涉及一个知识点:数组的元素是按照数组元素序号从小到大排列的。

意思就是左边是低字节右边才是高字节,也就是 ‘w’=0x68,这是明显错误的,因此我们应该把v9倒着读,所以v9 = ‘hadow’;同理 src = ‘NDCLS’ 。

可以进入WinHex证实:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果从内存中看,hadow,h就是高字节,存放到5这个高地址处。即小端序存储。

4.脚本


for循环的处理就是将key数组里的大写换成小写,因此key = ”adsfkndcls“;

在这里插入图片描述

flag{KLDQCUDFZO}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sciurdae

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

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

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

打赏作者

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

抵扣说明:

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

余额充值