【逆向 | CTF】BUUCTF reverse3

下载附件,第一件事,看后缀名

为什么要强调,因为我以为是跟第一二题一样,是没有后缀的东西,直接扔进去IDA

然后发现报错,以为有壳,扔进OD手动脱壳,发现OD也打不开

后来才发现这是ZIP压缩包

解压出来后,ctrl+F12,搜索flag

进入后,ctrl+x 查找调用处

我把代码搬过来,写备注分析

    

  // 从这里开始是正题
  sub_41132F("please enter the flag:", v7); 
  sub_411375("%20s", (char)Str);  // 我们写入的东西放入变量 Str,并强转字符类型
  v3 = j_strlen(Str);   // 输入字符的数量放入变量 v3
  v4 = (const char *)sub_4110BE(Str, v3, v14);  // 这里最屌,这是base64编码,后面讲
  strncpy(Destination, v4, 0x28u);  // 编码后,复制内容,放入变量 Destination,复制长度为28字符
  v11 = j_strlen(Destination);  // 获取字符串长度,放入变量 v11

  // 开启 for 循环,有多少字符就循环多少次
  for ( j = 0; j < v11; ++j )
    // 替换字符
    Destination[j] += j;   // 每一个字符转成数字,都加上循环数字j,再转成ascii码得到字符

  v5 = j_strlen(Destination);  // 也是检测字符串长度
  if ( !strncmp(Destination, Str2, v5) )  // 变量Destination 与 常量Str2 进行比较
    sub_41132F("rigth flag!\n", v8);  // 相等就输出;
  else
    sub_41132F("wrong flag!\n", v8);
  return 0;

搞了一大轮,很多代码是重复来干扰你的,

光是strlen就出现了好几次,

其实都是检测我们输入的字符串长度而已

读完源代码,其实就是把我们输入的内容首先经过base64加密

再经过for循环加密

与Str2这个常量进行判断,所以逻辑贼简单

Str2点击进去能看到内容:e3nifIH9b_C@n@dH

反向for循环解码,再解码base64就可以了

int main(){

    char Str2 [] = "e3nifIH9b_C@n@dH";  // 常量
    int j = strlen(Str2)-1;  // 长度是16,但索引是0-15,所以要减一
    
    
    for( ; j>=0; j--){   // 反向for循环,从大到小
        Str2[j] = Str2[j] - j;  // 减回去就行了
    }
    printf("%s",Str2);

    return 0;
}

最后解码:{i_l0ve_you}

flag{i_l0ve_you}

吐槽一下:那个base64函数编码,都不知道大神是怎么看出来base64编码的,我放进文心千帆的AI也判断不出来,反编译都乱成这样,你们居然也能看出来,NB啊

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星盾网安

能花钱买到的知识,都不贵

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

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

打赏作者

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

抵扣说明:

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

余额充值