CISCN2024初赛Reverse部分wp
Re
asm_re
txt找到密文
找到关键逻辑,*0x50 +0x14 ^0x4d +0x1e后面还有一段
也可以问一下gpt得到流程
1 | |
直接除去密文然后爆破
1 | |
androidso_re-1
法1
已知flag格式和内部32位
先des再base64
so层两个函数尝试hook返回值
很奇怪竟然报错了
用脚本一直无法hook,用objection可以注入 objection -g com.example.re11113 explore
android hooking watch class_method com.example.re11113.jni.getiv –dump-args –dump-return –dump-backtrace
输入格式和长度相同的flag:flag{12345678901234567890123456789012}
一次只能注入一个,得到结果后要新开cmd
后面直接解密
1 | |
上面的图说明frida的时候会读到非utf-8的字符
1 | |
法2
大部分师傅直接逆代码
上面搜到base64,猜测凯撒偏移
rc4解密之后再异或也行
只取前八位
法3
https://blog.csdn.net/Pisces50002/article/details/139580143
安装r0env集成环境:https://pan.baidu.com/share/init?surl=y6ceiOzWuv0Gl5FNksgciQ 提取码:v8at
把so和apk文件放到java文件夹下
1 | |
gdb_debug-1
伪随机数只取高位
xor rand->交换下标->xor rand->xor string
按理seed生成的伪随机数会很大,与调试结果不符,这也就是题目要求我们调试的原因
一种思路是输入一个flag,得到密文之后xor得到rand1,rand3和ptr,当然可以一位位提取数据
看汇编去找把rax作为地址的内存,记住开始位置后直接跳出循环,全部提取,这题神奇的点在双击数组进去看不到密文
而需要在调试时看看寄存器的值找内存
1 | |
最后一位爆破即可:flag{78bace5989660ee38f1fd980a4b4fbcd}
还有一种是直接用时间戳,注意要在linux下运行
1 | |
个人比赛的时候就用了这种,但是rand2的生成循环写反了,以及rand1和rand3的位置没考虑
1 | |
whereThel1b-1
法1
Cpython题,比赛的时候一直想着是import的问题,后面要用kali已经来不及了
找base64的时候能找到Pyx_CreateStringTabAndInitStrings,有base和random
__pyx_n_s_pla通常用于存储字符串常量
参数0引用过去,在同一个函数下找
找到random
猜测seed为0
同样的方法找到base64
感觉随机数最大56应该是猜的,因为刚好56位
1 | |
法2
还有直接爆破的,python要为3.10
1 | |
法3
黑盒测试,猜测与base64有关
输入42个a,得到ret与base64后的结果
1 | |
发现输出有明显的Zmxh,为flag的base64编码,解密得到flag
法4
字符之间相互不影响,针对调用库的子函数,考虑用模拟退火算法
1 | |
rust_baby-1
法1
有一些字符串去解密
交叉引用上述字符串找到关键函数,往下翻
调试发现数据在v21,不足8为位用E填充,8C3函数没逆,经过尝试发现
1 | |
之后^0x33,总共104个字节
下内存断点,找到下一次用该内存的地方
直接到下一段处理的地方,v96貌似是定值
后面的0xAB是填充位
根据上面104字节,异或的密钥也要104字节,但是这里只有8字节,用0去异或任何值都不影响结果
在xor那里下断点,然后把输入的全改为0
再取消断点,运行到cmp处,提取密钥
这是base64,狠人
上面有段解密不了的base64就是密文
1 | |
法2
用frida插桩爆破
cmp的函数
1 | |
可以采取一点点增加的方式,每次爆2字节然后报错
1 | |