首页 > 其他分享 >BUUCTF-REVERCE-[2019红帽杯]easyRE

BUUCTF-REVERCE-[2019红帽杯]easyRE

时间:2023-03-14 19:34:42浏览次数:53  
标签:子串 BUUCTF 加密 函数 flag 2019 红帽 include 破解

[2019红帽杯]easyRE

​ 偶尔还是得花时间在难题上面啊。虽然很麻烦,但吃透之后真的是受益匪浅,比狂刷简单题有效多了。

1.破解1

一般而言,寻找非随机数会是比较快捷的方式。典型的就是子串。
image-20230314180137960

在这里可以看到0X4A26C0有一串典型的base64编码,0X4A2348应该就是base加密后的子串。
(结合题目easyre,当时以为里面就是flag)
解密后是一个网址
image-20230314180820624

https://bbs.pediy.com/thread-254172.htm

image-20230314180848702

帖子本身非常经典,学逆向的其实都该去看看。
内容简单来说,就是教你做程序的时候怎样设套,让破解者陷入泥淖。或者说,当我们找到这网址的时候,就已经掉陷阱里面了……

话虽如此,因为缺少符号表,所有的函数都没有名字,一个个用手去翻实在太慢了。所以,唯一的线索仍然是那些子串。

2.交叉引用,找到加密函数(?)

image-20230314182144573

image-20230314182225790

这个地方最先引起了我的注意,“you found me!”真的很像flag会出现的地方,想必大部分师傅们最开始也会从这个地方先入手。但是0x6cc090中的字符串其实就是那一串bese64……

image-20230314182320175

image-20230314182759395

因为以已经踩过坑了,所以不到万不得已我是不会去破解这个地方的(况且那个0x400e44函数真的很恐怖)。正好,在这之前还有一段加密程序,其和base64的解密没有任何关联,子串也非常不起眼,可以尝试破解一下。

image-20230314183326237

在破解之前,补充一点小知识:

  1. memset的后面一般都会跟上scanf或者read函数
  2. 有些时候连续创建的几个数组可能是同一个数组。可以通过查看地址进行核验。

img

这里v12的数组大小是13,而v14和它的距离也正好是13,说明它们的地址是连在一起的,v14同理。也就是说得到了v12的基地址,也就可以控制v12/13/14。至于那个127,在子串中可以表示为分隔符,但在这个地方直接写作”\x7F”就行了。

3.破解2

根据上述知识,先美化一下代码,看得更清楚一点。

image-20230314183836235

加密就是最简单的异或,所以照模照样写就行了。
image-20230314184007880

结果:flag的最前面四个字符是"flag"
好吧,说白了就是又被坑了。但并不是没有收获,其本身或许也可以是一个线索?

4.找下一条线索

这个时候是真没办法了,只能到处乱逛看看有什么漏洞。翻了附近了几个函数,结果发现这么一个函数。

image-20230314184623377

第20行的代码,将两个子串(?)和f、g进行了比对,这和我们之前拿到的“flag”这个线索有所贴合。

于是开始进行分析:
1.前18行代码说白了就是对v1进行加密,而且因为密文是随机生成的,所以光凭这段代码是无法进行破解的。
2.需要注意的是,v1在定义时虽然是int类型,但其大小达到了4字节。并且v1==v4
3.第20行代码中,HIBYTE()的意思其实是取最高位的字节,也就是第四个字节。这和"g"在flag"的位置是相吻合的。

然后查看0X6CC0A3

image-20230314185909858

按A转换成子串

image-20230314185952295

长度和正好是25,可以确定是该函数的密文。然后key就是v1(v4),其可以通过和“flag”异或进行还原。
到这里,所有信息都收集完毕,可以着手下一次破解了。

5.破解3

加密方式是用v4循环地对密文逐位进行异或加密。所以解密也很简单,用"flag"解出v4,然后对密文异或就好了。

image-20230314190703871

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<unistd.h>
#include<fstream>
using namespace std;

int main(){
    string a = "Iodl>Qnb(ocy\x7Fy.i\x7F";
    a += "d`3w}wek9{iy=~yL@EC";
    for(short int i = 0; i < a.length(); i ++){
        cout << char(int(a[i]) ^ i);
    }
    char flag[] = {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};
    char key[4];
    key[0] = 'f' ^ flag[0];
    key[1] = 'l' ^ flag[1];
    key[2] = 'a' ^ flag[2];
    key[3] = 'g' ^ flag[3];
    cout << endl;
    for (short j = 0; j <= 24; ++j )
        cout << char(flag[j] ^ key[j % 4]);
}

flag{Act1ve_Defen5e_Test}

总结

掉进坑里,爬出来,掉进另一个坑里……其实这道题很符合我最初对逆向的想象,一点点收集线索,一步步逼近真相。最后看到flag跳出来的时候真的是非常高兴,可以说是切实感受到了逆向的魅力。

标签:子串,BUUCTF,加密,函数,flag,2019,红帽,include,破解
From: https://www.cnblogs.com/koi514/p/17216017.html

相关文章

  • 2019 ICPC Asia-East Continent Final
    D考虑树形DP,记\(f[u],g[u]\)分别为最终回到u/停在子树中的最晚第一次到达u的时间。原本以为在枚举了最后一个的情况下,遍历子树的顺序是以f升序的,(因为只有最后一个不对后面......
  • P8680 [蓝桥杯 2019 省 B] 特别数的和
    P8680[蓝桥杯2019省B]特别数的和[蓝桥杯2019省B]特别数的和题目描述小明对数位中含有2、0、1、9的数字很感兴趣(不包括前导0),在1到40中这样的数包括1、2......
  • [BUUCTF]Reverse-[BJDCTF2020]JustRE
      进去之后直接看字符串窗口,发现一个疑似flag的,点进去查看    我的妈耶!良心啊,直接把flag给我们了,呜呜呜呜,真的好少见这种淳朴的出题人!!!BJD{1999902069a4579......
  • WindowsServers2019摄像头不可用的解决方案
    1、系统服务开启启动管理员命令提示符,执行下列命令scconfigAudiosrvstart=autoscconfigAudioEndpointBuilderstart=autoscconfigstisvcstart=autoscconfigWPD......
  • 【编辑器】常用编程环境使用感受20190804
    一、编辑器1、Vim/Emase又被称之为神器:编辑器之神vs神之编辑器学习使用成本高and定义所有功能2、Sublime/Vscode/Atom现在编辑器,有以下特点:跨平台,颜值高,性能佳3、Note......
  • 2019百度之星程序设计大赛 1005 Seq
    ProblemDescription度度熊有一个递推式a_{n}=(\sum_{i=1}^{n-1}a_{i}*i)%na​n​​=(∑​i=1​n−1​​a​i​​∗i)%n其中a_1=1a​1​​=1。现给......
  • BUUCTF-PWN-warmup_csaw_2016
    定期pwn一下维持手感1.检查啥都没有捏2.找漏洞ida静态分析从main里面找到get找到shell思路是简单的栈溢出3.信息收集get_addr:0x40069E距离rbp:0x40shell_add......
  • buuctf
    1、JustRE首先将文件放入exeinfope查看是否有壳 发现无壳,32位放入ida32位查看 没找到什么有用的东西按shift+f12查找字符串 发现一处类似flag的代码 按住ct......
  • [蓝桥杯 2019 省 A] 修改数组 ———并查集练习(大学复健)
    本题拿到第一反应桶排序思想似乎可以水过,但是很明显出问题了。#include<bits/stdc++.h>usingnamespacestd;intN;inlineintkd(){ intx=0,f=1;charch=getchar......
  • 2019GPLT
    2019GPLT7-26翻了从左到右扫描输入的句子:如果句子中有超过3个连续的6,则将这串连续的6替换成9;但如果有超过9个连续的6,则将这串连续的6替换成27。其他内容不......