2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

admin 2024年6月27日22:02:47评论3 views字数 4830阅读16分6秒阅读模式

省流:

之前参加网鼎杯的写的解题报告,整理了一下发上来,排名能靠前全靠逆向第二题拿大分。

Crypto

题目1

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

解题过程 读题是一个hash函数碰撞的问题,总共13位,已知前五位,搜一搜发现苹果AirDrop采用的hash函数是sha256,写个python脚本爆破一下

1.需要找到一个8位数字的代码,将其附加到密钥"86170"后进行SHA-256哈希,结果与给定的哈希匹配。

2.暴力破解方法:遍历所有可能的8位数字组合(从"00000000"到"99999999"),将每个组合附加到密钥后进行哈希,并将结果与给定的哈希进行比较。

3.匹配即停止:当找到匹配项时,我们打印出该代码及其对应的哈希值。

import hashlib
ss = '0123456789'

txt2 = "86170"

sha256enc="c22a563acc2a587afbfaaaa6d67bc6e628872b00bd7e998873881f7c6fdc62fc"
key=txt2

for a in ss:
  for b in ss:
    for c in ss:
      for d in ss:
        for e in ss:
           for f in ss:
             for g in ss:
               for h in ss:


                  code = a+b+c+d+e+f+g+h
                  encinfo = hashlib.sha256(bytes( (key+code).encode() ) ).hexdigest()
                  if encinfo == sha256enc:
                   print(code)
                   print(encinfo)
                   break

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

得到未知密文部分为“91733716” 拼起来即为flag:{8617091733716}

Reverse

题目1

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

解题过程 下载文件是一个Windows可执行程序Re2.exe。运行程序时,提示输入flag。

使用IDA Pro打开程序文件,发现只有几个函数,这表明程序可能进行了加壳处理。看到红框部分指令(如图片中所示),这通常表示程序在解压完成后进入真正的指令执行部分。

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

将程序拖入x64dbg,在怀疑的解压完成处设置断点,方便后续快速进入真实指令执行部分。尝试使用x64dbg逐步分析程序,但感觉不太顺利。尝试查了下壳,使用DetectEasy发现是upx壳。

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

尝试使用命令upx -d Re2.exe进行脱壳,但未成功,可能程序进行了防护处理。使用010 Editor打开程序,发现一些被替换的内容(如UPX0和UPX1),手动将它们修改回原始值。分别修改成UPX0和UPX1

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

再次使用UPX脱壳命令,成功脱壳。结合IDA的静态分析和x64dbg的动态调试,可以更快地进行后续分析。

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

根据之前分析,直接在ida中找到对输入求长度并判断的部分(从字符串中也可以找到)

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup
2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

在IDA中找到对输入求长度并判断的部分代码(如图片所示)。第一个校验点:输入长度应为20。第二个校验点:输入的每个字符进行异或运算(如0x66)。

进入sub_1400111E5函数,查看详细的校验逻辑。代码简单对输入进行了运算,并将结果与全局数组内容进行比较。

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

就简单对输入运算了下,最后判断运算结果和如下图的全局数组内容是否一致,这只需要反着计算即可拿到flag

已知全局数组的内容:

a = [0x4B, 0x48, 0x79, 0x13, 0x45, 0x30, 0x5C, 0x49, 0x5A, 0x79, 0x13, 0x70, 0x6D, 0x78, 0x13, 0x6F, 0x48, 0x5D, 0x64, 0x64, 0x18]

逆向运算得到flag:

for b in a:
    print(chr(((b ^ 0x50) - 10) ^ 0x66), end="")
2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup
2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup
a = [0x4B, 0x48, 0x79, 0x13, 0x45, 0x30, 0x5C, 0x49, 0x5A, 0x79, 0x13, 0x70, 0x6D, 0x78, 0x13, 0x6F, 0x48, 0x5D, 0x64, 0x64, 0x18]
for b in a:
    print(chr(((b^0x50) - 10)^0x66), end="")

运行则得flag

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

题目2

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

解题过程

拿到apk发现安装不成,尝试重新打包成apk并签名,成功安装 使用mt管理器反编译一下dex,发现函数指令被抽走了,再一看luoyesiqiu.shell里的类,更加确定是函数抽取型加固,得想办法把恢复原始dex,一开始使用blackdex64来恢复,没成功

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup
2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

于是考虑使用frida脚本,github有dump dex的,直接用一下命令

frida-dexdump -U -f com.example.testchouqu

成功提出dex文件,如下图

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

依次用mt管理器打开,找到有Checkfxxk的dex,这里是classes02.dex,执行dex2jar转换为jar包,方便分析,使用jd-jui打开分析。

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

思路很明确,输入两个字符串,一个必须是“helloctf”,另一个需要逆向出来。可以看到代码使用了控制流混淆,没猜错的话用的是BlackObfuscator(Android Dex控制流平坦化混淆)。尝试寻找反混淆的工具,未果,只好硬分析,期间又尝试了执行该class中的函数,但会死循环。分析差不多,主要是下面的代码

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

猜测应该是已有的某种加密,否则不会这么复杂,查询资料发现基本和tea加密一样,i6,i8相当于两个明文,i2即sum,1640531527为delta,循环32轮。原始tea加密过程中delta是成倍增加的,但在这里是成倍减少,因此解密算法也和常规的不一样,这里也花了大量时间去思考 解密时delta初始值应该是加密是最后的那个delta值,并且要成倍递增才行。下图是最终比较阶段,可以看到new byte[]后8个字节是可打印的字符,再考虑到arrayofInt2[0]=i6 arrayofInt2[1]=i8,即只对前8字节进行tea加密,因此要输入的后8个字符串就是下面后8个字节,前八个字节按照上面说的tea解密算法解密即可。

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

写脚本解密即可拿到flag

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup
public class HelloWorld {
    // 将byte转换为无符号int
    public static int transform(byte b) {
        return b < 0 ? b + 256 : b;
    }

    // 将int转换为byte数组
    public static byte[] toHH(int n) {
        byte[] b = new byte[4];
        b[3] = (byte) (n & 0xff);
        b[2] = (byte) (n >> 8 & 0xff);
        b[1] = (byte) (n >> 16 & 0xff);
        b[0] = (byte) (n >> 24 & 0xff);
        return b;
    }

    public static void main(String[] args) {
        // 预设的加密数组和byte数组
        int[] arrayint = {2023708229, -158607964, -2120859654, 1167043672};
        byte[] p = {-63, -69, -86, 43, 126, 114, 32, -75};

        // 将byte数组转换为int
        int i6 = transform(p[3]) | transform(p[2]) << 8 | transform(p[1]) << 16 | p[0] << 24;
        int i8 = transform(p[7]) | transform(p[6]) << 8 | transform(p[5]) << 16 | p[4] << 24;

        // TEA解密算法
        int k = arrayint[0];
        int m = arrayint[1];
        int n = arrayint[2];
        int i1 = arrayint[3];
        int i2 = 0 - 32 * 1640531527;  // 初始delta值为加密时的最后一个delta值

        for (int a = 0; a < 32; a++) {
            i8 -= ((i6 << 4) + n) ^ (i6 + i2) ^ ((i6 >> 5) + i1);
            i6 -= ((i8 << 4) + k) ^ (i8 + i2) ^ ((i8 >> 5) + m);
            i2 += 1640531527;  // delta值递增
        }

        // 转换解密结果并打印
        byte[] res = toHH(i6);
        byte[] res2 = toHH(i8);
        byte[] other = {102, 49, 65, 103, 121, 107, 111, 99};  // 固定的后8位

        for (byte b : res) {
            System.out.print((char) b);
        }
        for (byte b : res2) {
            System.out.print((char) b);
        }
        for (byte b : other) {
            System.out.print((char) b);
        }
    }
}

题目3

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

题目是go语言写的东西,首先安装配置go运行环境,花了点时间,将内容复制到Challenge.go

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

解题过程 执行go run challenge.go

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

让输入两个函数 函数1:该函数有6个参数,第三个参数名字为gLIhR 打开文件并搜索gLIhR:使用代码编辑器打开challenge.go文件,搜索字符串gLIhR。我们需要找到一个有6个参数的函数,并且第三个参数名为gLIhR。

在Go语言中,函数定义的形式通常如下:

func functionName(param1 type1, param2 type2, gLIhR type3, param4 type4, param5 type5, param6 type6) returnType {
    // function body
}
2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

函数2:该函数被3个函数调用,且该函数调用了函数cHZv5op8rOmlAkb6

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

该题纯粹体力活,函数1查找gLIhR string,寻找满足条件的即可

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

函数2查找return cHZv5op8rOmlAkb6(,然后有查找该项的调用者的名字,统计次数,看是否被其他函数调用了3次,

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

最终可得到下面结果

2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup
2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup
2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup
2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeup

原文始发于微信公众号(攻防SRC):2022年第二届“网鼎杯”网络安全大赛—青龙组—我就是来划水的-Writeup

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月27日22:02:47
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2022年第二届网鼎杯网络安全大赛—青龙组—我就是来划水的-Writeuphttps://cn-sec.com/archives/2893230.html

发表评论

匿名网友 填写信息