吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2722|回复: 5
收起左侧

[CTF] [NPUCTF2020]芜湖

[复制链接]
Y1rannn 发表于 2022-3-26 00:45

image-20220325231856984.png

挺明显的混淆痕迹

image-20220325232059421.png

进来的函数长这样, 稍稍命名发现最好还是动调, 上面这一部分都没见输入, 不管啥都能动调拿不香么

image-20220325232432131.png

它说了一大堆也没见输入.

image-20220325232631888.png

我盲猜好吧, 一共34条话, 每条长度在lenTable里, 信息在binTable里, binTable被解密之后输出, 但是我猜binTable没用完,后面还有

image-20220325232742267.png

我尝试一下直接patch这个34, 让它再来一次(其实应该真的去看看这个bin有没有那么大, 但是我懒了)

好吧, 说到这儿我发现还得patch lentable, 我们还是去bintable看看猜测对不对

程序能访问到的最后一个是bin[42*34+len[34]],  0x5b0, 看看bin多长, 1472 = 0x5c0, 不过后面全是0, 看来猜错了.

可是应该也没有反调, 那答案究竟在哪里呢

image-20220325233332540.png

lentable长度基本上都是32, 40之类的, 但是bin却用42做一行, 会藏在每行后面么? 把bintable按每行42个看..后面也都是空的, 没什么问题, 没有办法, 我们去func1里面看看吧

每次把v2的第i位取出, 做func1的第一个参数, 第二个参数则是'a'的第i位, 返回值填到v2的第i位

image-20220325233916482.png

func1长这样

image-20220325233949890.png

那我看来它就是构造了一个完全没用到的string, 然后返回了两个参数的一个逻辑运算值, 先分析下func1这个逻辑运算到底啥样的, v2 = !(a1 & a2) , v3 = !(a1& v2) ...

v4 = v2, v5 = !(v2 & a2), v6 = !(v5&v3), 化简一下 : !(!(!((a1a2)a2))(!((a1a2)a1)) ... 这东西应该就是.. a1^a2 ? 随便验证一下, 这就是五个与非门的串

>>> def f1(a, b) :
...     return not (a&b)
...
>>> def f2(a, b) :
...     v2 = f1(a, b)
...     v3 = f1(a, v2)
...     v4 = v2
...     v5 = f1(b, v4)
...     return f1(v3, v5)
...
>>> f2(0, 0)
False
>>> f2(0, 1)
True
>>> f2(1, 1)
False

'a' 是0b110001, 这个输出汉字的变换明白了, 可是那个没用的string数据还是没有解开.

我觉得不妨尝试一下把那些数据也用同样的方式跑一下, 毕竟这程序也没别的地方了

image-20220325235457428.png

这里我忽略了这个func2... 是在找数据的时候通过xref一层一层发现的, 那现在就有两个入手点了, 另外还看到了一个base64表, 我想从表这儿入手

image-20220325235824191.png

看一下func2到底干了啥吧

image-20220326000648228.png

都在围绕这个string1做事, 我们直接去string1的地址

image-20220326001246063.png

是个Base64.. 我都看了一遍就是这些汉字串的Base64

B64隐写

答案在这儿:

image-20220326001510468.png

晕, 这不是谜语题么, 这正常谁能想到啊, 不过转B64明文再解密这一步确实有点怪, 算提示?

写个脚本撕了吧, 每个=能提供两位的隐写

#include <cstdio>
#include <cstring>
#include <cstdint>
#include <string>
using std :: string;
uint8_t binTable1[35][42] = {
{84u,84u,24u,89u,84u,56u,12u,47u,87u,56u,4u,47u,84u,0u,50u,47u,84u,84u,16u,36u,87u,0u,46u,46u,84u,17u,12u,23u,45u,38u,92u,92u,0u,0u,0u,0u,0u,0u,0u,0u,0u,0u},
 ... 略{2u,82u,55u,22u,59u,57u,40u,6u,3u,54u,39u,15u,0u,54u,44u,6u,5u,83u,88u,24u,3u,38u,51u,74u,7u,6u,92u,92u,0u,0u,0u,0u,0u,0u,0u,0u,0u,0u,0u,0u,0u,0u}
};
int lenTable1[36] = {
  32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 20, 40, 40, 40, 16, 32, 32, 32, 40, 24, 32, 24, 28, 20, 40, 28, 32, 28, 20, 40, 28, 32, 28, 0
};
string s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
uint8_t b64[35][42];
void change(uint8_t* Src, uint8_t* Dst, int len) {
    for(int i = 0; i < len; i ++ ) {
        uint8_t tmp = 0;
        for(int j = 0; j < 8; j ++ ) {
            tmp = (tmp << 1) | (((Src[i] >> (7 - j)) & 1) ^ (('a' >> (7 - j)) & 1));
        }
        Dst[i] = tmp;
    }
}
int main() {
    for(int i = 0; i < 35; i ++ ) {
        change(binTable1[i], b64[i], lenTable1[i]);
    }
    for(int i = 0; i < 35; i += 2) {
        uint8_t tmp = 0;
        tmp = s.find(b64[i][lenTable1[i]-3]) & 0xF;
        tmp <<= 4;
        tmp |= s.find(b64[i+1][lenTable1[i+1]-3]) & 0xF;
        putchar((char)tmp);
    }
}
//npuctf{Fly1ng!!!}

免费评分

参与人数 6吾爱币 +11 热心值 +5 收起 理由
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Badao63 + 1 鼓励转贴优秀软件安全工具和文档!
0xCaner + 1 + 1 我很赞同!
鞋带老掉 + 1 + 1 谢谢@Thanks!
monk3435 + 1 + 1 谢谢@Thanks!
夫子点灯 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
zhang1314 发表于 2022-3-26 01:49
提示: 该帖被管理员或版主屏蔽
0xchuxiuyun 发表于 2022-3-26 09:31
头像被屏蔽
wzt0524 发表于 2022-3-26 12:14
士喂知己者屎 发表于 2022-3-26 19:54
不明觉厉
tencentma 发表于 2022-3-26 23:02
这个帖子写的详细,看来是楼主自己操作的,我觉得有些地方可以模仿一些楼主。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-25 02:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表