BUUCTF reverse题解汇总
Posted 御麟蹬辉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BUUCTF reverse题解汇总相关的知识,希望对你有一定的参考价值。
本文是BUUCTF平台reverse题解的汇总
题解均来自本人博客
目录
Page1
- easyre
- reverse1
- reverse2
- 内涵的软件
- 新年快乐
- xor
- helloworld
- reverse3
- 不一样的flag
- SimpleRev
- Java逆向解密
- [GXYCTF2019]luck_guy
- [BJDCTF2020]JustRE
- 刮开有奖
- 简单注册器
- pyre
- [ACTF新生赛2020]easyre
- findit
- rsa
- [ACTF新生赛2020]rome
- [FlareOn4]login
- CrackRTF
- [GUET-CTF2019]re
- [WUSTCTF2020]level1
- [2019红帽杯]easyRE
- [MRCTF2020]Transform
- [SUCTF2019]SignIn
- [WUSTCTF2020]level2
- [ACTF新生赛2020]usualCrypt
- [HDCTF2019]Maze
- [MRCTF2020]Xor
- Youngter-drive
Page2
- 相册
- [MRCTF2020]hello_world_go
- [WUSTCTF2020]level3
- [FlareOn4]IgniteMe
- [GWCTF 2019]xxor
- [WUSTCTF2020]Cr0ssfun
- [FlareOn6]Overlong
- [UTCTF2020]basic-re
- [FlareOn3]Challenge1
- [ACTF新生赛2020]Oruga
- 特殊的 BASE64
- [BJDCTF2020]BJD hamburger competition
- [Zer0pts2020]easy strcmp
- [ACTF新生赛2020]Universe_final_answer
- [WUSTCTF2020]level4
- crackMe
- [网鼎杯 2020 青龙组]singal
- [GUET-CTF2019]number_game
- findKey
- [羊城杯 2020]easyre
- [网鼎杯 2020 青龙组]jocker
- [FlareOn5]Minesweeper Championship Registration
- firmware
- [ACTF新生赛2020]SoulLike
- [GWCTF 2019]re3
- [GXYCTF2019]simple CPP
- [FlareOn5]Ultimate Minesweeper
- [MRCTF2020]PixelShooter
- [FlareOn1]Bob Doge
- [2019红帽杯]xx
- [CFI-CTF 2018]IntroToPE
- equation
Page3
- [2019红帽杯]childRE
- [SWPU2019]ReverseMe
- [羊城杯 2020]login
- [QCTF2018]Xman-babymips
- [安洵杯 2019]crackMe
- [GKCTF 2021]QQQQT
- [NPUCTF2020]你好sao啊
- [UTCTF2020]babymips
- [WUSTCTF2020]funnyre
- [GUET-CTF2019]encrypt
- [WMCTF2020]easy_re
- [CISCN2018]2ex
- [RoarCTF2019]polyre
- [watevrCTF 2019]Timeout
- [SCTF2019]babyre
- [安洵杯 2019]game
- [SCTF2019]Strange apk
- [2019红帽杯]Snake
- [ACTF新生赛2020]fungame
- [羊城杯 2020]Bytecode
- [FlareOn2]very_success
- [网鼎杯 2020 青龙组]bang
- [GWCTF 2019]babyvm
- [SUCTF2018]babyre
- [BSidesSF2019]blink
- [SCTF2019]Who is he
- [SCTF2019]creakme
- [HDCTF2019]MFC
- [NPUCTF2020]Baby Obfuscation
- [MRCTF2020]EasyCpp
- [NPUCTF2020]BasicASM
- [ACTF新生赛2020]Splendid_MineCraft
Page4
- [SUCTF2019]hardcpp
- Dig the way
- [MRCTF2020]Shit
- [watevrCTF 2019]Repyc
- [CFI-CTF 2018]powerPacked
- [FlareOn6]Memecat Battlestation
- [De1CTF2019]Re_Sign
- [FlareOn1]Javascrap
- [GKCTF 2021]Crash
- [FlareOn1]Shellolololol
- HellScream
- [FlareOn4]greek_to_me
- [b01lers2020]chugga_chugga
- [INSHack2018]Tricky-Part1
- [FBCTF2019]go_get_the_flag
- [FlareOn6]FlareBear
- [MRCTF2020]VirtualTree
- [watevrCTF 2019]esreveR
- [watevrCTF 2019]esreveR
- [CFI-CTF 2018]Automated Reversing
- [FlareOn2]starter
- [FlareOn2]starter
- [2019红帽杯]calc
- [De1CTF2019]cplusplus
- [XMAN2018排位赛]Dragon Quest
- [b01lers2020]little_engine
- [GKCTF 2021]SoMuchCode
- [FlareOn2]YUSoMeta
- [SWPU2019]EasiestRe
- [GXYCTF2019]minecraft
- [QCTF2018]babyre
- [NPUCTF2020]EzObfus-Chapter2
以上是BUUCTF reverese的题解汇总,本文会持续更新
Buuctf-Reverse FlareOn3-Challenge Write up
0x00 日常查壳
无壳32位
0x01 主函数
观察一下主程序 发现就是比较字符串的题目
加密函数再401260
0x02 分析加密函数
分析401260
这不就是base加密吗
shift + e 导出数据 这是码表打乱的base64加密
所以只要拿个base脚本 然后改个码表 就出flag
0x03 细谈base加密
但是只懂用加密脚本的我一开始是怀疑这是base加密 但看着加密不是很难就自己在分析
直到做完题看了别人的wp才终于懂了这是base的加密过程
所以这里就记录一下对base的理解
加密过程
1. 取出3个数 再创建一个无符号数用来存放 0000 0000(v7) 0000 0000(v6) 0000 0000(v5)
2. 然后再拆分这24位 拆成四组(为什么是原数组的4/3倍的原因)每个数都是6位
3. 拆的数是2^6次方 也就是64 所以为什么是base64 于是在码表里找对应下标
4. 于是出来的数就是base64加密
解密过程
1. 目标v3恢复 所以要恢复每个6位 encode == table[decode_6]
2. 四个为一组(因为加密的时候是三个一组变四位) 找到数据的对应下标 也就是原始数据的24位中的6位
3. 再讲4个6位合并成24位 再拆分为3个8位
4. 恢复原始数据
0x04 GetFlag
解密脚本!
#include <stdio.h>
#include <string.h>
int main(void)
{
char key[] = "x2dtJEOmyjacxDemx2eczT5cVS9fVUGvWTuZWjuexjRqy24rV29q";//打乱码表出的数据
int data[] = //data放打乱的码表
{
0x5A, 0x59, 0x58, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,
0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x7A, 0x79, 0x78, 0x61,
0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B,
0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
0x76, 0x77, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x2B, 0x2F
};
unsigned int v3 = 0;
int flag[100] = {0};
int i, j;
for(i = 0; i < 52; i++) //这边注意 52比较好 用strlen识别到0就停了
for(j = 0; j < 64; j++)
if(key[i] == data[j])
{
key[i] = j; //当是第35时 给赋值成0 于是后面再用strlen会导致在35停下
// printf("%d:%d ",i,j);
break;
}
for(i = 0, j = 0; i < 52; i += 4, j += 3) //这边也就是注意用加密后字符串长度
{
v3 = key[i+3] + (key[i+2] << 6) + (key[i+1] << 12) + (key[i] << 18);
flag[j] = (v3 >> 16) & 0xFF;
flag[j+1] = (v3 >> 8) & 0xFF;
flag[j+2] = v3 & 0xFF;
}
for(i = 0; i < 39; i++) //52/4*3也就是39 原始数据长度
printf("%c",flag[i]);
return 0;
}
GetFlag
以上是关于BUUCTF reverse题解汇总的主要内容,如果未能解决你的问题,请参考以下文章