强网杯2024 solve2-apk-赛题解析

admin 2025年1月14日21:59:33评论4 views字数 2600阅读8分40秒阅读模式

我们首先使用jeb进行分析,搜索关键词success定位到逻辑。

强网杯2024 solve2-apk-赛题解析

外层函数是一个魔改tea,过了前32字节检测才能进入下一个函数进行判断。

强网杯2024 solve2-apk-赛题解析
#include <iostream>#include <cstdio>#include <stdint.h>  // For uint32_tusing namespace std;void tea_decrypt(uint32_t* v) {    uint32_t v0 = v[0], v1 = v[1], sum = 0xC6EF3720, i;     uint32_t delta = 0x9e3779b9;    uint32_t k[5] = { 5983236481213115916970832168274853062};for (i = 0; i < 32; i++) {        v1 -= (((v0 << 4) + k[2] ^ v0) + (sum ^ (v0 >> 5)) + k[3]);        v0 -= (((v1 << 4) + k[0] ^ v1) + (sum ^ (v1 >> 5)) + k[1]);        sum -= delta;    }    v[0] = v0;    v[1] = v1;}uint32_t switchEndian(uint32_t num) {return ((num >> 24) & 0x000000FF) | // 取最高字节           ((num >> 8) & 0x0000FF00) | // 取第二字节           ((num << 8) & 0x00FF0000) | // 取第三字节           ((num << 24) & 0xFF000000); // 取最低字节}int main() {    uint32_t key[] = { 5983236481213115916970832168274853062 };    uint32_t data[] = {0x5E5440B020570462280x4A1ED2280x233FE7C0x964614500x88A670ED0xF79BFC890x20C3D75F,0    };for (int i = 0; i < 8; i += 2) {tea_decrypt(&data[i]);    }for (int i = 0; i < 8; ++i) {         data[i] = switchEndian(data[i]);    }printf("%s",data);return 0;}// Come on you are about to get it>

即可得到前32位的正确数据,将后面的测试数据放在>后继续在H0.a.successWithString()中进行二轮check。

进入这个函数即可看到两个[256]的sbox,将部分数据搜索即可知为twofish算法。

强网杯2024 solve2-apk-赛题解析
强网杯2024 solve2-apk-赛题解析

找到源码与jeb里的很相似

:https://android.googlesource.com/platform/tools/base/+/master/jobb/src/main/java/Twofish/Twofish_Algorithm.java

/**    * Use (12, 8) Reed-Solomon code over GF(256) to produce a key S-box    * 32-bit entity from two key material 32-bit entities.    *    * @param  k0  1st 32-bit entity.    * @param  k1  2nd 32-bit entity.    * @return  Remainder polynomial generated using RS code    */private static final int RS_MDS_Encode( int k0, int k1) {      int r = k1;for (int i = 0; i < 4; i++) // shift 1 byte at a time         r = RS_rem( r );      r ^= k0;for (int i = 0; i < 4; i++)         r = RS_rem( r );return r;   }
强网杯2024 solve2-apk-赛题解析

我们在H0.a.c处下断点动调获取key:

强网杯2024 solve2-apk-赛题解析
强网杯2024 solve2-apk-赛题解析

即可得到twofish的key。

根据代码可知有两段data[16],我们可以对v2[15]下断点得到所有的data。

强网杯2024 solve2-apk-赛题解析

import twofishkey = bytes.fromhex("000102030405060708090a0b0c0d0e0f")  # keytf = twofish.Twofish(key)data1 = bytes([159, 46, 128, 211, 56, 34, 22, 223, 236, 150, 252, 143, 26, 34, 136, 115])decrypted1 = tf.decrypt(data1)print(decrypted1)#flag{iT3N0t7H@tH

即可得到前半段flag,我们将前半部分flag输入进去再进行check即可得到part2的check。

Come on you are about to get it>flag{iT3N0t7H@tH111111111111111}

之后有对我们传入的测试值的flag的part2的异或数据提取出来(这第二段算法是rc4,直接将加密后的值异或回去即可得到)。

强网杯2024 solve2-apk-赛题解析

将这段数据异或我们的输入再异或data2[16]即可还原得到第二段flag。

data2 = [16921711818911918786154491792221681011422650]enc1 = bytes([0xD80xAD0x710xC80x760xD30x280xFD0x370xEA0xA60xF70x3F0xEC0x1B0x32])enc2 = b'111111111111111}'dec2 = ''.join(chr(data2[i] ^ enc1[i] ^ enc2[i]) for i in range(len(data2)))print(dec2)#@E6D0YOV7hInkS0}

这wp应该是出题人的预期解,本人走了许多弯路最终写出这份wp供大家学习。

来源:看雪学苑

#往期精选#

强网杯2024 solve2-apk-赛题解析

强网杯2024 solve2-apk-赛题解析

强网杯2024 solve2-apk-赛题解析

强网杯2024 solve2-apk-赛题解析

强网杯2024 solve2-apk-赛题解析

原文始发于微信公众号(赛查查):强网杯2024 solve2-apk-赛题解析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月14日21:59:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   强网杯2024 solve2-apk-赛题解析http://cn-sec.com/archives/3627917.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息