热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2022年春秋杯网络安全联赛冬季赛Reversegodeep

题目下载链接:https:pan.baidu.coms1dcHfAhLsxeGzXdnCTDJuuQ?pwdD0g3提取码:D0g3首先个人把这个题目归类为迷宫题目,简称Go语言迷

题目下载

链接:https://pan.baidu.com/s/1dcHfAhLsxeGzXdnCTDJuuQ?pwd=D0g3

提取码:D0g3


首先个人把这个题目归类为迷宫题目,简称Go语言迷宫


首先监测一下exe的信息

发现是Go语言写的64为exe,然后没有TLS回调,没有软件的保护

然后拖入IDA分析

分析的时候,发现,没有main函数

只有类似于

runtime.main
main.main

这样的函数

后来通过IDA和IDC的分析,发现一些启动函数,慢慢的逐层调用到main.main

然后就是分析void __cdecl main_main()函数,他是主要开始的函数

main.main函数,其实代码并不多

void __cdecl main_main()
{
__int64 v0; // r14
_QWORD *v1; // rax
__int64 v2; // [rsp-38h] [rbp-78h]
__int64 v3; // [rsp-38h] [rbp-78h]
__int64 v4; // [rsp-38h] [rbp-78h]
__int64 v5; // [rsp-30h] [rbp-70h]
__int64 v6; // [rsp-30h] [rbp-70h]
void *retaddr; // [rsp+40h] [rbp+0h] BYREF
while ( (unsigned __int64)&retaddr <= *(_QWORD *)(v0 + 16) )
runtime_morestack_noctxt();
fmt_Fprintln();
v2 = fmt_Fprintln();
v5 = runtime_newobject(v2);
*v1 = 0LL;
fmt_Fscanf(v3, v5);
//分割线-------------------------------------------------------------
//分析了很久,发现 上面是一些输入的处理
main_convert(v4, v6);//这里就是主要加密的函数,对我们的输入做了一些处理
godeep_tree_ApSzXJOjiFA();//这里就是进入迷宫了
}

然后搜索关键字符串,比如

right
wrong

发现只有一个地方调用了字符串right

很多个地方调用了字符串wrong,就很奇怪

简单的分析

xx1->xx2->xx3->...->right输出函数

于是直接分析懵逼了,一个无线的套娃,不知道到底该怎么进入right输出函数

我还测试手动追踪那个过程,直接分析麻了,太多函数了,最后放弃手动追踪

然后分析继续分析main函数,第一次进入godeep_tree_ApSzXJOjiFA()

发现函数,啥也没干,

就直接判断,然后对你输出结果"wrong",否则进入下一个函数

没看见输出"right"

void godeep_tree_ApSzXJOjiFA()
{
_BYTE *v0; // rax
__int64 v1; // rcx
__int64 v2; // rbx
__int64 v3; // r14
bool v4; // zf
void *retaddr; // [rsp+8h] [rbp+0h] BYREF
_BYTE *v6; // [rsp+10h] [rbp+8h]
_BYTE *v7; // [rsp+10h] [rbp+8h]
__int64 v8; // [rsp+20h] [rbp+18h]
while ( (unsigned __int64)&retaddr <= *(_QWORD *)(v3 + 16) )
{
v7 = v0;
v8 = v1;
runtime_morestack_noctxt();
v0 = v7;
v1 = v8;
}
v4 = v2 == 0;
if ( !v2 )
{
v6 = v0;
godeep_tree_wrong();
v4 = 1;
v0 = v6;
}
if ( v4 )
runtime_panicIndex();
if ( *v0 )
godeep_tree_QBLerFck();
else
godeep_tree_PeVbW();
}

然后继续分析,发现感觉就像是无线的套娃,但是又不像是递归调用,因为每个函数的名字都不一样

然后放弃分析,直接动态调试

动态调试也很g,它时不时的监测反调试,让后修改你的RIP寄存器,然后调试的时候就直接让人崩溃

我测试动态调试了一段时间,反正调试麻了,exe动不动就监测我在调试

只要我F7/F8,我就麻了,它修改我的RIP,然后我每次都要sei ip,把IP给恢复回来

对于它的手段,我很难破解,对Go不了解

动态分析发现了一些东西,但是还是人麻了,没有太多的收获

分析结果:

每次函数的进入,都依赖于某个值的判断

if ( !v2 )//决定你要失败的情况
{
v6 = v0;
godeep_tree_wrong();
v4 = 1;
v0 = v6;
}
if ( *v0 )//根据标志v0来判断进入哪一个函数
godeep_tree_QBLerFck();
else
godeep_tree_PeVbW();

v0标志是一个数组的地址,那个数组全是01的二进制数组是char类型,每个字节都是0或者1

然后每次函数的进入,都会推动数组v0的遍历

类似于

if ( *v0 )//根据标志v0来判断进入哪一个函数
v0++;
godeep_tree_QBLerFck();
else
v0++;
godeep_tree_PeVbW();

当然,每一次函数的进入还做了其它变量的修改,我没有分析出来

但是竟然没有影响最后flag的获取,运气好

于是又去分析main函数,去探究那个01的数据流是哪里来的,多半和我们的flag输入有一定的关系

进入main函数,分析main_convert.然后还是人麻了,没有太多的收获,主要是没看见下面的操作

+ - * / & | % & 发现main_convert基本没有用到这些运算

于是人麻了,看不出来main_convert在干嘛

然后百度了一下涉及的函数

比如简单分析了一下下面的函数

runtime_decoderune(v23);
runtime_convT32(v23);
fmt_Sprintf(v23, v25, v28, v30, v31); // 格式化字符串转化函数,涉及字符串 ; "%08b"
runtime_stringtoslicebyte(v24, v26, v29);

主要对GO语言不太了解,百度了相关的函数,也还是不理解,感觉函数有点复杂,但是这些函数应该和编码有关系

然后我就继续分析,直接放弃main_convert的分析,直接把它当作黑盒子,这个黑盒子可能生成了01的数据流

看一下我们传递进去的数据和我们传递出来的数据有什么联系

我先测试数据

输入字符串'ABC',发现生成了3个qword

输入字符串'AB',发现生成了2个qword

输入字符串'A',发现生成了1个qword

当我输入1字节字符串的时候,然后分析那个qword,8字节,然后发现

那8个字节是字母'A'的bit位,好比01000001

于是猜想,main_convert是把我们的每个flag[i]转化为了8字节的bit流

然后输入字母'B',发现生成8字节,是'001000010`

输入字符串'ABC',发现生成了3个qword,是字符串ABC的二进制流

这样的话,我们就很明白了

题目把我们的字符串分解为01数据流,然后根据01决定我们进入哪一个函数

看起来就像是一个迷宫

但是问题来了,我们怎么知道去往flag迷宫终点呢?

之前手动分析了如果追踪flag迷宫终点

手动分析了34个函数,就直接放弃了,太多了

于是我想起来使用IDC脚本,IDC我以前从lyshark博客那里学了一些

但是只会copy IDC的脚本使用,不会手写

但是,这一次我必须得学会手写IDC,否则没办法做题

于是在lyshark博客的帮助下,我成功拿到了迷宫终点的路径

lyshark IDC 博客

https://www.cnblogs.com/LyShark/p/13100048.html

然后下面是我自己写的IDC脚本,不可以直接使用

需要在在已经有的基本IDC基础上,把right输出的终点函数名字修改为flag

我只是喜欢把终点函数叫flag,然后可以跑出路径

ICD脚本+地图终点路径 在Github存放着,旁边点击下载

https://gist.github.com/re4mile/c459aa433407461d960e72c3df51516c

于是我拿着去往地图终点的路径尝试手动翻译01,前往

然后手搓来288位,flag出来了,288位,手搓错了.woc

不可能再去检查了,因为288位的0和1本来就人麻了.所以我还是尝试写一个IDC脚本

打印一个去往地图终点的01路径

在lyshark博客的帮助下,成功写出了打印终点路径的IDC

ICD脚本+获取flag的代码 在Github存放着,旁边点击下载

https://gist.github.com/re4mile/a090ac548e4641ff6c2e311f804bd311

最后就ok了

fc03bd97-ff7b-419f-8987-78bc745d3b0a



推荐阅读
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 在IDEA中运行CAS服务器的配置方法
    本文介绍了在IDEA中运行CAS服务器的配置方法,包括下载CAS模板Overlay Template、解压并添加项目、配置tomcat、运行CAS服务器等步骤。通过本文的指导,读者可以轻松在IDEA中进行CAS服务器的运行和配置。 ... [详细]
  • 求解连通树的最小长度及优化
    本文介绍了求解连通树的最小长度的方法,并通过四边形不等式进行了优化。具体方法为使用状态转移方程求解树的最小长度,并通过四边形不等式进行优化。 ... [详细]
author-avatar
木瓜香皂a
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有