[ACTF新生赛2020]Splendid_MineCraft 题解

举报
御麟 发表于 2023/04/26 20:46:00 2023/04/26
【摘要】 ​ Some men just want to watch the world burn.    ——The Dark Knight1.查壳32bit无壳2.静态分析看一下流程图,右上角有一个独立的分支,可能是SMC进入主函数看一下这一段是将输入的字符串根据“_”分割 strtok函数可以参考这一篇博客strtok函数_橘子13的博客-CSDN博客将输入的字符串按照根据+5 +9差4个,再加...

 Some men just want to watch the world burn.    ——The Dark Knight

1.查壳

  • 32bit
  • 无壳

2.静态分析

看一下流程图,右上角有一个独立的分支,可能是SMC

进入主函数看一下

这一段是将输入的字符串根据“_”分割 

strtok函数可以参考这一篇博客strtok函数_橘子13的博客-CSDN博客

将输入的字符串按照

根据+5 +9差4个,再加上+9强转为WORD,得到每组字符是4+2=6个

根据这段代码推导出的flag的格式是ACTF{xxxxxx_xxxxxx_xxxxxx}

 然后我们发现37行之后的看不懂了

我们可以静态调试一下这一部分

3.动态调试

在37行这里下断点,哪里不懂断哪里

操作看视频(打开bilibili更清晰):

d6bf243283e3a83ea05b52d940b2577b.jpeg

代码自修改调试视频

编辑

这段代码对数据进行了操作,修改为真正的程序代码

修改过程为将esi+edi+0x1F指向的地址的数据取出,与0x72异或后放回,然后edi增加,循环151次

从寄存器窗口记录一下ESI的值,编写脚本需要

我们可以回到静态调试界面,按照上面所说的过程编写脚本模拟修改过程

Shift+F2打开脚本

脚本为

#include<idc.idc>
static main(){
    auto addr=0x8D51DD+0x1F; //以你的ESI值为准
    auto i;
    for(i=0;i<=0x151;i++)
        PatchByte(addr+i,Byte(addr+i)^0x72);
}

运行脚本

将修改后的数据选中,按下C分析为代码

再次选中,按下P分析为函数

此过程视频如下:

7537cf759f4af26d5e4953664d747e3d.jpeg

脚本处理smc

4.分析代码爆破第一段flag

分析破解刚才分析出来的函数,传入这个函数的参数就是flag的第一部分xxxxxx


根据这个函数编写wp

v4='3@1b;b'
v3='elcome '
flag=''
for i in range(6):
    flag+=chr((ord(v4[i])^ord(v3[i]))+35)
print(flag)

 flag的第一部分是yOu0y*

5. 找到第三段flag

继续看代码,下面的循环可能是又一个SMC,应该和flag的第二部分有关

这时候我们先找一找别的线索,不急看第二部分的SMC

shift+F12查看字符串

发现一个可疑的字符串,跟进看一看


 发现有个strcmp,这是比较简单的比较

所以第三部分的flag是5mcsM<

现在我们已知两部分flag

ACTF{yOu0y*_xxxxxx_5mcsM<}

6.使用OD动态调试——找出第二段加密函数

编辑for ( i = 256; i < 496; ++i )
     byte_CF5018[i] ^= v9;

SMC之后会进去跳转到汇编

__asm { jmp     eax }

我们使用OD(Ollydbg)在jmp eax处下断点

跟汇编找出第三段flag的加密函数

找加密函数的视频:

32ae5a2dd8aeebf7672e537308b6ab02.jpeg

OD找加密函数

分析加密函数

关键加密函数分析如图注释所示

然后我们跟随jmp跳转到下图

我们加密函数处理过的结果在bl,和cl进行了比较

说明cl就是加密之后的flag第二部分

查看一下cl的值


 

cl的值就是上图的六个值

我们根据加密过程编写脚本爆破 

data = [0xF6, 0xA3, 0x5B, 0x9D, 0xE0, 0x95, 0x98, 0x68, 0x8C, 0x65,
        0xBB, 0x76, 0x89, 0xD4, 0x09, 0xFD, 0xF3, 0x5C, 0x3C, 0x4C,
        0x36, 0x8E, 0x4D, 0xC4, 0x80, 0x44, 0xD6, 0xA9, 0x01, 0x32,
        0x77, 0x29, 0x90, 0xBC, 0xC0, 0xA8, 0xD8, 0xF9, 0xE1, 0x1D,
        0xE4, 0x67, 0x7D, 0x2A, 0x2C, 0x59, 0x9E, 0x3D, 0x7A, 0x34,
        0x11, 0x43, 0x74, 0xD1, 0x62, 0x60, 0x02, 0x4B, 0xAE, 0x99,
        0x57, 0xC6, 0x73, 0xB0, 0x33, 0x18, 0x2B, 0xFE, 0xB9, 0x85,
        0xB6, 0xD9, 0xDE, 0x7B, 0xCF, 0x4F, 0xB3, 0xD5, 0x08, 0x7C,
        0x0A, 0x71, 0x12, 0x06, 0x37, 0xFF, 0x7F, 0xB7, 0x46, 0x42,
        0x25, 0xC9, 0xD0, 0x50, 0x52, 0xCE, 0xBD, 0x6C, 0xE5, 0x6F,
        0xA5, 0x15, 0xED, 0x64, 0xF0, 0x23, 0x35, 0xE7, 0x0C, 0x61,
        0xA4, 0xD7, 0x51, 0x75, 0x9A, 0xF2, 0x1E, 0xEB, 0x58, 0xF1,
        0x94, 0xC3, 0x2F, 0x56, 0xF7, 0xE6, 0x86, 0x47, 0xFB, 0x83,
        0x5E, 0xCC, 0x21, 0x4A, 0x24, 0x07, 0x1C, 0x8A, 0x5A, 0x17,
        0x1B, 0xDA, 0xEC, 0x38, 0x0E, 0x7E, 0xB4, 0x48, 0x88, 0xF4,
        0xB8, 0x27, 0x91, 0x00, 0x13, 0x97, 0xBE, 0x53, 0xC2, 0xE8,
        0xEA, 0x1A, 0xE9, 0x2D, 0x14, 0x0B, 0xBF, 0xB5, 0x40, 0x79,
        0xD2, 0x3E, 0x19, 0x5D, 0xF8, 0x69, 0x39, 0x5F, 0xDB, 0xFA,
        0xB2, 0x8B, 0x6E, 0xA2, 0xDF, 0x16, 0xE2, 0x63, 0xB1, 0x20,
        0xCB, 0xBA, 0xEE, 0x8D, 0xAA, 0xC8, 0xC7, 0xC5, 0x05, 0x66,
        0x6D, 0x3A, 0x45, 0x72, 0x0D, 0xCA, 0x84, 0x4E, 0xF5, 0x31,
        0x6B, 0x92, 0xDC, 0xDD, 0x9C, 0x3F, 0x55, 0x96, 0xA1, 0x9F,
        0xCD, 0x9B, 0xE3, 0xA0, 0xA7, 0xFC, 0xC1, 0x78, 0x10, 0x2E,
        0x82, 0x8F, 0x30, 0x54, 0x04, 0xAC, 0x41, 0x93, 0xD3, 0x3B,
        0xEF, 0x03, 0x81, 0x70, 0xA6, 0x1F, 0x22, 0x26, 0x28, 0x6A,
        0xAB, 0x87, 0xAD, 0x49, 0x0F, 0xAF]
m = [0x30, 0x4, 0x4, 0x3, 0x30, 0x63]
flag = ''
for i in range(6):
    for j in range(256):
        if m[i] == data[j]:
            flag += chr(j ^ (0x83 + i))
            break
print(flag)

knowo3

flag{yOu0y*_knowo3_5mcsM<}



【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。