迷蒙马背眠,月随残梦天边远,淡淡起茶烟。

                                                        ——松尾芭蕉

目录

1.查壳

2.拖入64位IDA,找到主函数

3.静态分析主函数

4.wp


1.查壳

ELF文件,64bit

2.拖入64位IDA,找到主函数

没有标明main函数,我们打开string窗口跟踪一下存储的字符串常量

发现一个base64编码表,base64不懂的查看博文base64

点击这个编码表跟进

将光标放在上面按下快捷键X查看调用这个字符串的地方

点击进入

按下F5反汇编

while ( v2 < v4 - 2 )
  {
    *(_BYTE *)(v6 + v2) = aAbcdefghijklmn[*(_BYTE *)(v3 + a1) >> 2];
    *(_BYTE *)(v6 + v2 + 1LL) = aAbcdefghijklmn[(16 * (*(_BYTE *)(v3 + a1) & 3)) | (*(_BYTE *)(v3 + 1LL + a1) >> 4)];
    *(_BYTE *)(v6 + v2 + 2LL) = aAbcdefghijklmn[(4 * (*(_BYTE *)(v3 + 1LL + a1) & 0xF)) | (*(_BYTE *)(v3 + 2LL + a1) >> 6)];
    *(_BYTE *)(v6 + v2 + 3LL) = aAbcdefghijklmn[*(_BYTE *)(v3 + 2LL + a1) & 0x3F];
    v3 += 3;
    v2 += 4;
  }

这是base64编码的代码,需要知道base64编码算法的特征

这个函数有传入的参数,应该不是主函数

将光标放在函数名出,按下快捷键N重命名为base64encode

我们继续回到string窗口,查看别的可疑字符串

我们用同样的方法找到You find me字符串被使用的函数

这个函数应该是主函数

可以重命名一下函数名,光标放在函数名上,按下快捷键N

int __cdecl main(int argc, const char **argv, const char **envp)
{__int64 v3; // raxint result; // eaxunsigned __int64 v5; // rax__int64 v6; // raxint i; // [rsp+Ch] [rbp-114h]__int64 v8; // [rsp+10h] [rbp-110h]__int64 v9; // [rsp+18h] [rbp-108h]__int64 v10; // [rsp+20h] [rbp-100h]__int64 v11; // [rsp+28h] [rbp-F8h]__int64 v12; // [rsp+30h] [rbp-F0h]__int64 v13; // [rsp+38h] [rbp-E8h]__int64 v14; // [rsp+40h] [rbp-E0h]__int64 v15; // [rsp+48h] [rbp-D8h]__int64 v16; // [rsp+50h] [rbp-D0h]__int64 v17; // [rsp+58h] [rbp-C8h]char v18; // [rsp+60h] [rbp-C0h]char v19; // [rsp+61h] [rbp-BFh]char v20; // [rsp+62h] [rbp-BEh]char v21; // [rsp+63h] [rbp-BDh]char v22; // [rsp+64h] [rbp-BCh]char v23; // [rsp+65h] [rbp-BBh]char v24; // [rsp+66h] [rbp-BAh]char v25; // [rsp+67h] [rbp-B9h]char v26; // [rsp+68h] [rbp-B8h]char v27; // [rsp+69h] [rbp-B7h]char v28; // [rsp+6Ah] [rbp-B6h]char v29; // [rsp+6Bh] [rbp-B5h]char v30; // [rsp+6Ch] [rbp-B4h]char v31; // [rsp+6Dh] [rbp-B3h]char v32; // [rsp+6Eh] [rbp-B2h]char v33; // [rsp+6Fh] [rbp-B1h]char v34; // [rsp+70h] [rbp-B0h]char v35; // [rsp+71h] [rbp-AFh]char v36; // [rsp+72h] [rbp-AEh]char v37; // [rsp+73h] [rbp-ADh]char v38; // [rsp+74h] [rbp-ACh]char v39; // [rsp+75h] [rbp-ABh]char v40; // [rsp+76h] [rbp-AAh]char v41; // [rsp+77h] [rbp-A9h]char v42; // [rsp+78h] [rbp-A8h]char v43; // [rsp+79h] [rbp-A7h]char v44; // [rsp+7Ah] [rbp-A6h]char v45; // [rsp+7Bh] [rbp-A5h]char v46; // [rsp+7Ch] [rbp-A4h]char v47; // [rsp+7Dh] [rbp-A3h]char v48; // [rsp+7Eh] [rbp-A2h]char v49; // [rsp+7Fh] [rbp-A1h]char v50; // [rsp+80h] [rbp-A0h]char v51; // [rsp+81h] [rbp-9Fh]char v52; // [rsp+82h] [rbp-9Eh]char v53; // [rsp+83h] [rbp-9Dh]char v54[32]; // [rsp+90h] [rbp-90h]int v55; // [rsp+B0h] [rbp-70h]char v56; // [rsp+B4h] [rbp-6Ch]char v57; // [rsp+C0h] [rbp-60h]char v58; // [rsp+E7h] [rbp-39h]char v59; // [rsp+100h] [rbp-20h]unsigned __int64 v60; // [rsp+108h] [rbp-18h]v60 = __readfsqword(0x28u);v18 = 73;v19 = 111;v20 = 100;v21 = 108;v22 = 62;v23 = 81;v24 = 110;v25 = 98;v26 = 40;v27 = 111;v28 = 99;v29 = 121;v30 = 127;v31 = 121;v32 = 46;v33 = 105;v34 = 127;v35 = 100;v36 = 96;v37 = 51;v38 = 119;v39 = 125;v40 = 119;v41 = 101;v42 = 107;v43 = 57;v44 = 123;v45 = 105;v46 = 121;v47 = 61;v48 = 126;v49 = 121;v50 = 76;v51 = 64;v52 = 69;v53 = 67;memset(v54, 0, sizeof(v54));v55 = 0;v56 = 0;sub_4406E0(0LL, v54, 37LL);v56 = 0;LODWORD(v3) = sub_424BA0((const __m128i *)v54);if ( v3 == 36 ){for ( i = 0; ; ++i ){LODWORD(v5) = sub_424BA0((const __m128i *)v54);if ( i >= v5 )break;if ( (unsigned __int8)(v54[i] ^ i) != *(&v18 + i) ){result = -2;goto LABEL_13;}}sub_410CC0("continue!");memset(&v57, 0, 0x40uLL);v59 = 0;sub_4406E0(0LL, &v57, 64LL);v58 = 0;LODWORD(v6) = sub_424BA0((const __m128i *)&v57);if ( v6 == 39 ){v8 = base64encode((__int64)&v57);v9 = base64encode(v8);v10 = base64encode(v9);v11 = base64encode(v10);v12 = base64encode(v11);v13 = base64encode(v12);v14 = base64encode(v13);v15 = base64encode(v14);v16 = base64encode(v15);v17 = base64encode(v16);if ( !(unsigned int)sub_400360(v17, off_6CC090) ){sub_410CC0("You found me!!!");sub_410CC0("bye bye~");}result = 0;}else{result = -3;}}else{result = -1;}
LABEL_13:if ( __readfsqword(0x28u) != v60 )sub_444020();return result;
}

3.静态分析主函数

if ( v3 == 36 ){for ( i = 0; ; ++i ){LODWORD(v5) = sub_424BA0((const __m128i *)v54);if ( i >= v5 )break;if ( (unsigned __int8)(v54[i] ^ i) != *(&v18 + i) ){result = -2;goto LABEL_13;}}

关注这部分

if ( i >= v5 )
        break;

这是循环结束的条件

照着这个循环用脚本模拟一下,看看会输出什么

string=[73,111,100,108,62,81,110,98,40,111,99,121,127,121,46,105,127,100,96,51,119,125,119,101,107,57,123,105,121,61,126,121,76,64,69,67]
flag=""
for i in range(0,35):flag+=chr(string[i]^i)
print(flag)

输出:

Info:The first four chars are `flag`

前四个字符是flag

继续往下分析

是一组base64加密

黄色部分是一个strcmp函数

跟进off_6CC090

继续跟进aVm0wd2vhuxhtwg

 这是一个base64编码将这个base64编码多次解码

解密网站

不断解密

进入这个网址

没什么用,纯属干扰解题的坑

下面有一个数据,使用快捷键X交叉引用查看一下

到这个函数中分析一下

unsigned __int64 sub_400D35()
{unsigned __int64 result; // raxunsigned int v1; // [rsp+Ch] [rbp-24h]int i; // [rsp+10h] [rbp-20h]int j; // [rsp+14h] [rbp-1Ch]unsigned int v4; // [rsp+24h] [rbp-Ch]unsigned __int64 v5; // [rsp+28h] [rbp-8h]v5 = __readfsqword(0x28u);v1 = sub_43FD20(0LL) - qword_6CEE38;for ( i = 0; i <= 1233; ++i ){sub_40F790(v1);sub_40FE60();sub_40FE60();v1 = (unsigned __int64)sub_40FE60() ^ 0x98765432;}v4 = v1;if ( ((unsigned __int8)v1 ^ byte_6CC0A0[0]) == 102 && (HIBYTE(v4) ^ (unsigned __int8)byte_6CC0A3) == 103 ){for ( j = 0; j <= 24; ++j )sub_410E90((unsigned __int8)(byte_6CC0A0[j] ^ *((_BYTE *)&v4 + j % 4)));}result = __readfsqword(0x28u) ^ v5;if ( result )sub_444020();return result;
}
if ( ((unsigned __int8)v1 ^ byte_6CC0A0[0]) == 'f' && (HIBYTE(v4) ^ (unsigned __int8)byte_6CC0A3) == 'g' ){for ( j = 0; j <= 24; ++j )sub_410E90((unsigned __int8)(byte_6CC0A0[j] ^ *((_BYTE *)&v4 + j % 4)));}

v1是unsigned int 四个字节,高字节与低字节抑或分别是f和g,中间还有两个字节,那么很可能按位与其抑或就是flag

然后循环取出这四个字节与数据段异或就是flag

4.wp

data=[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]
four=['f','l','a','g']
data2=[]
flag=""
for i in range(4):data2.append(data[i]^ord(four[i]))   #两次异或等于没有异或
for i in range(len(data)):flag+=chr(data[i]^data2[i%4])
print(flag)

flag{Act1ve_Defen5e_Test}

其他题解请关注我的专栏reverse

[2019红帽杯]easyRE1题解相关推荐

  1. buu [2019红帽杯]xx1 wp

    首先用exeinfo打开它,发现是无壳的64位程序. 逆向先静后动,因此先用ida 打开: main函数代码如下: int __cdecl main(int argc, const char **ar ...

  2. buu [2019红帽杯]childRE wr

    这个题是有一定难度的,它考的知识点不是特别常见,对于萌新来说. 解题步骤: 1. 下载完附件之后先进行查壳 无壳,我们直接拖进ida64中.通过shift+f12查看字符串 找到输出flag的字符串通 ...

  3. [2019红帽杯]easyRE writeup

    很想挑战难题,发现自己连writeup也看不懂 用64bit的ida打开,查找字符 找到函数: signed __int64 sub_4009C6() {signed __int64 result; ...

  4. BUUCTF-[2019红帽杯]SnakeDig the way

    [2019红帽杯]Snake 题目下载:下载 下载完文件是一个用C#编写的untiy程序,对于这种程序果断用dnSpy查看Assembly-CSharp.dll 找到如下位置 发现这些函数都导入了In ...

  5. 2019蓝桥杯每周一题第二周之Mineweep(扫雷)

    2019蓝桥杯每周一题第二周之Mineweep(扫雷) 写在开头: 写这个题的时候真的是一次次的纠错,题不难,里面的逻辑关系有复杂,每一次都以为会运行正确了,结果又一个小地方出错,写了一上午还是有问题 ...

  6. 2019 蓝桥杯省赛 B 组模拟赛(一)蒜厂年会

    2019 蓝桥杯省赛 B 组模拟赛(一)蒜厂年会 这题有两种情况 1.最大的和是在0~n-1 2.最大的和越过了首尾 这时候只要用n个数的和 - 0~n-1 的连续的最小和 这是求连续子集最大.最小 ...

  7. Comet OJ 2019 夏季欢乐赛题解

    Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...

  8. 面向萌新的红帽杯2018线上赛wp

    网络安全攻防大赛第二届"红帽杯"网络安全攻防大赛(除了web3 guess id,不会做.没写.) misc2 Not Only Wireshark 下载流量包,wireshark ...

  9. [CTFHub] 2021-第四届红帽杯网络安全大赛-Web-find_it

    [CTFHub] 2021-第四届红帽杯网络安全大赛-Web-find_it 看群里说CTFHub上复现了, 我来看看 本来想按照红帽杯的套路来试一下,发现phpinfo里莫得flag了 只能想想其他 ...

最新文章

  1. Oracle创建序列,删除序列,得到序列的例子
  2. 一些有关计组实验中Quartus中的名词或术语的解释
  3. (数据挖掘 —— 无监督学习(聚类)
  4. [云炬创业基础笔记]做好市场调研
  5. BugKuCTF WEB 计算器
  6. C++ STL deque创建
  7. 使用Maven构建Java项目
  8. Android仿人人客户端(v5.7.1)——采用ViewGroup做父容器,实现左侧滑动菜单(三)...
  9. 对称正定矩阵的Cholesky分解
  10. html控制变量范围,加入控制变量后结果悲催了?!
  11. 国外15种手机游戏引擎和开发工具介绍
  12. mac iphone模拟器_在Mac上找到iPhone和iPad模拟器
  13. 计算机网络层次结构特点,网络层次结构
  14. 2018山东冬令营:还钱问题,UPC(5700) 还钱问题
  15. 力扣每日一题第495题提莫攻击
  16. uniapp easycom教程
  17. Bailian2725 跳格问题【模拟】
  18. M1 Mac安装 PS 2021 闪退、卡启动界面解决方法
  19. c程序中的实型常量都是双精度浮点型常量
  20. bash(CVE-2014-6271) shellshock-破壳漏洞复现

热门文章

  1. 51单片机之IO口扩展——74HC165芯片并行转串行实验
  2. 中国InGaAs APD接收器市场深度研究分析报告
  3. vlookup java_Vlookup的VBA错误处理
  4. css中的div容器笔记
  5. 用python简单入门写糖葫芦!
  6. HDU -- 免费馅饼(ACM Step: 3.2.8)
  7. word出现错误报告的解决办法
  8. win7台式计算机怎么连热点,win7热点怎么设置 win7热点设置的具体方法介绍
  9. 做seo为什么要了解网站
  10. java基于springboot房产备案管理系统