吾爱破解2024解题领红包之新手思维过程记录
本帖最后由 jackyyue_cn 于 2024-2-27 20:01 编辑【前言】
每年的春节解题领红包活动都会令人兴奋,并且认真参与会学习到不少东西。
尤其是翻看大佬们的教程,简直是一个不断哇塞的过程。
但如果作为像我一样技术和知识储备不那么丰富的新手,从思维和手段上可能和大佬不太一样。
因此记录本过程,以便找到和大佬的差距,进一步学习提升。
【02-Windows初级题】经过去年做题的经验和学习后总结:拿到EXE先查脱壳和固定基址
然后找字符串关键词下断点,一步步调试分析后知道大致方向了,还可以对相关函数下断电
EXE文件直接用DiE查看一下,无壳无加密,32位
StudyPE+打开,动态基址,直接点击“固定PE基址”后另存
运行一下,随便输入一下,提示“Error, please try again”
x32dbg 载入EXE,停到EntryPoint处。
点击上面 Az 按钮搜索字符串,可以看到许多可疑的东西,F2下断点吧
(上面还有提示凯撒加密,下面有个奇怪的字符串,有这方面基础应该可以直接解密)
F9运行,前面断点可以不管,一直到输入密码处,随便输入一个“1234567890”,断在“Error, please try again"
向上找发现有比较并跳转
cmp dword ptr ss:,24
...
je xxxxx
发现为0x0A,是10位,也就是输入密码的长度,因此推测密码应该是0x24=36位
再次调试,输入“123456789012345678901234567890123456”
成功断下,发现ecx和反汇编窗口中直接出现了flag ,应该是要作明文比较。成功解出!
【03-Android初级题】安卓题强烈建议看论坛中正己大佬的《安卓逆向这档事》系列教程,基本上初级中级没问题。
方法一:这道题直接玩游戏围小猫就行(要从离边缘处开始围),成功了看视频
方法二:无意中用十六进制编辑器打开apk 直接搜索 flag 找到一个!(纯属运气)
方法三:应该可以用frida搞一下,因为时间关系就没试了
【04-Android初级题】方法一:等时间,抽卡90发必中(大概一个多小时吧)
方法二:搭建雷电模拟器、装NP管理器,电脑安装Frida 、jadx
先用jadx打开apk看看,发现需要打开FlagActivity
(这里由于看代码的能力不够,frida知识不足,走了一段冤枉路,想尝试着用frida去改变出纠缠的时间间隔,未果~)
最后发现直接写一段frida代码打开FlagActivity就行(代码也是百度搜来的)
成功解出Flag!
【05-Android中级题】首先jadx中看一下,发现解锁错误 会调用有个checkPassword函数,里面明显有调用
"assets/classes.dex"里loadClass("com.zj.wuaipojie2024_2.C").getDeclaredMethod("isValidate", ...去验证密码的过程
到模拟器里打开NP管理器,打开apk里的classes.dex,用"DEX编辑Plus"分析,找到com.zj.wuaipojie2024_2.C那个类,点转为Java
发现getStaticMethod("isValidate"...)调用了fix()生成"2.dex",fix又调用了read(),而read中又要读data目录下的decode.dex
现在就是要找到2.dex ,找出 com.zj.wuaipojie2024_2.A类,看d()方法中的解密方法(原来classes.dex中的A.d是错的)
到模拟器目录下,运行cmd,输入 adb shell打开命令行
cd /data/user/0/com.zj.wuaipojie2024_2
cd app_data
来到目录下,ls一下,发现只有1.dex
cp 1.dex decode.dex
手动给它复制一个decode.dex,再运行,发现还是没有2.dex
仔细看了一下代码,发现在getStaticMethod中有个fix.delete()居然用完马上删掉了。。。
那么 我只有两个思路,一是写个sh脚本 不断检测到2.dex马上复制一份, 二是用frida代码主动去调用一次 fix(read()),结果就会生成2.dex
两种方法试了很久。。。好像是用frida费了好大力气才解出2.dex,用NP打开
找到A.d方法
发现A.d正确了,首先是比较包签名是否正确(所以重新打包改了签名可能是不会成功的)
然后比较密码 9位数,可以看到是前9位不重复的数字 048531267
重新输入正确的数字密码 图案和数字的对应关系:
0 1 2
3 4 5
6 7 8
然而。。。并没有什么反应!(此处找不到原因,只有读读大佬的分析帖子了)
不过在下面代码中显示线索在B.d
又打开dex找到com.zj.wuaipojie2024_2.B,发现又是一个错误的方法 没用
看来还是加密了,需要用到A一样的方法解密
回顾一下原来checkPassword的代码和C.isValidate的代码:
//MainActivity.checkPasswordString str2 = (String) new DexClassLoader(file.getAbsolutePath(), getDir("dex", 0)
.getAbsolutePath(), null, getClass().getClassLoader())
.loadClass("com.zj.wuaipojie2024_2.C")
.getDeclaredMethod("isValidate", Context.class, String.class, int[].class)
.invoke(null, this, str, getResources().getIntArray(R.array.A_offset));
// com.zj.wuaipojie2024_2.C
public static String isValidate(Context context, String str, int[] iArr) throws Exception {
try {
return (String) getStaticMethod(context, iArr, "com.zj.wuaipojie2024_2.A", "d", Context.class, String.class).invoke(null, new Object[]{context, str});
} catch (Exception e) {
Log.e(TAG, "咦,似乎是坏掉的dex呢!");
e.printStackTrace();
return "";
}
}
大致是加载dex后要调用getStaticMethod(context, <一个整数数组>, <一个类名>, <一个方法名>)这样去解密。
上面的代码中有R.array.A_offset,相应的在apk中也找到了R.array.B_offset。
接下来把刚才拿到的2.dex改名为decode.dex,再次用Frida等手段(当时都整到晚上了,具体过程有点乱没记录下来)
拿到解密后的2.dex, 这个就是A和B都解密过了,用NP打开找到B.d
可以找到flag的算法:比如我UID=1581363就是
Utils.md5(Utils.getSha1("0485312671581363".getBytes()))
这个就可以直接用frida脚本写一下,运行直接打印出来
这道题解了差不多一整天时间,还是基础不扎实啊!
【06-Windows高级题】高级题我基本是解不出来的,只记录一下思考过程
两个文件,照样先查壳、脱壳crackme2024.exe, UPX改,按照论坛教程 ESP大法,用x64dbg成功解压缩
crackme2024service.exe, Themida壳 研究了好久,最后在github上找到一个python脱壳脚本,试了一下可以解出来但exe有7M多,可以运行
先分析crackme2024, x64dbg加载,找字符串下断点:
随便输入uid,sn,断下来,往下分析发现有个比较 0x23,得到sn长度35位
再往下分析发现它调用了COM组件进行sn验证,看来得分析service了
对service静态分析了一圈 没有什么头绪
又用x32dbg对service动态调试了一圈,仍然没有头绪
由于对COM技术不懂 做不下去了。
分析失败。
【07-Android高级题】知道肯定解不出来,简单试一试
jadx分析一下,发现通过System.loadLibrary("52pojie")加载lib52pojie.so,再调用里面的checkSn(md5(uid), sn)函数进行验证。
找到lib52pojie.so,用IDA看到许多怪名字函数 用十六进制编辑器查看到有llvm obfuscator字样
百度了一下,ollvm这个东西太难搞了,跟着教程 又是准备unidbg又是搞虚拟机Kali环境
搞了好几天,无奈在unidbg加载so时始终出错(/ by zero),找不到原因,无法继续下去。
分析失败!
【08-Web题】
每年的web题会有许多有意思的地方,可以说是技术与艺术的完美结合~解题过程也是既紧张又开心的
下面按flag顺序列出:
flag1{52pj2024},视频有个点状图,中间黑色部分是字符。将速度调到0.5X慢慢看 就能看出来
flag2{xHOpRP}, 打开二维码网址后,F12打开开发人员选项,点“网络”,刷新一次,在http响应头中找找,有X-flag2字样
flag3{GRsgk2}, 在视频开头的一段雪花点图形序列中隐含,可以反复慢放能看出来 也可以用ffmpeg逐帧截图分析
flag4{YvJZNS}, 打开网址后,开发人员选项,同样在“网络”中可看到请求了flag4_flag10.png,下载即可看到
flag5{P3prqF}, 网页源码中有注释 flag5_flag9,下面有一长段代码 中间有断断续续的明文字母 提取即可
flag6{20240217}, 看源码,得知要求 md5(某数字) = '1c450bbafad15ad87c32831fa1a616fc'; 直接从cmd5.com查询得到
flag7{Djl9NQ}, 打开作者的github网址,上面有“删除不小心发出来的flag”字样。于是去找旧版本的 commit,在wip下找到
flag8{OaOjIK}, 直接玩游戏或通过 溢出 方法攻击得到
flag9{KHTALK}, 网页源码中,有一长段代码 将flag5删除,剩余的以点开头进行换行,就会组成一个ASCII图形
flag10{6BxMkW}, 前面下载的flag4_flag10.png,发现大小比同尺寸png大了一倍。试着用HEX编辑器将 宽度05 00改为0A 00 保存再打开查看 ,会隐约看到字符,这里我猜错了好几次 后来用百度找工具才看清楚
flag11{HPQfVF}, 像是拼图游戏,在源码里找到--var1和--var2,改变数值慢慢试
flag12{HOXI}, 查看代码后,直接穷举破解,每100万个输出一下log免得好像没反应 (开始从0起往上加,发现等了好久,所以改成从4294967295往下减 很快就出来了)
WebAssembly.instantiateStreaming(fetch('flag12.wasm'))
.then(({instance}) => {
const get_flag12 = (secret) => {
let num = instance.exports.get_flag12(secret);
let str = '';
while (num > 0) {
str = String.fromCodePoint(num & 0xff) + str;
num >>= 8;
}
return `flag12{${str}}`;
}
document.querySelector('button').addEventListener('click', (e) => {
e.preventDefault();
let i = 4294967295;
for( ; i>0; i-- ) {
let s = get_flag12(i);
if( s.length >8 ) {
console.log(i); console.log(s);
document.querySelector('#result').textContent = s;
break;
}
if( i % 1000000 == 0 ) console.log(i);
}
});
});
得到 4005161829 ,输入即可
flagA:修改cookie,将flagA的值给uid,再fetch('auth/uid/')
flagB:玩游戏,v50后提示 溢出,试了一下有提示“购买后钱变多,有bug”,通过尝试发现大约是QWORD数据(8字节),通过计算 0x10000000000000000 / 999063388 = 18464037713,在购买数量输入后成功!
同样方法可以大量买上面的道具,包括flag8。只不过用0x10000000000000000 / 10000 后不行。后来试了用 0x60000000000000000 / 10000 才行
flagC:用网站提示图片就会发现,有几张提示类别正确、位置错误的信息。下载图片,用ps将类别正确的图片多次尝试,先找类别,再找位置,很容易出来
【总结】
靠运气偶有得手,多学习才是正道!
祝大家龙年天天开心,事事顺心!
本帖最后由 鹿鸣 于 2024-2-25 13:42 编辑
https://66img.cc/images/2024/02/25/20240225133843.pnghttps://i2.100024.xyz/2024/02/25/m5bwbh.webp
这密码不对嘛,没出现success{:1_923:} 鹿鸣 发表于 2024-2-25 13:40
这密码不对嘛,没出现success
没有问题的,2o24中间是小写字母o,不是0 jackyyue_cn 发表于 2024-2-25 13:54
没有问题的,2o24中间是小写字母o,不是0
我这个也是o,但是报错,没看到问题在哪{:1_924:} 鹿鸣 发表于 2024-2-25 13:59
我这个也是o,但是报错,没看到问题在哪
晓得了,后来的题目改了,最开始的版本是可以的{:1_893:} 简单题第二题我设计的后门是直接用第三方app(快速启动、快捷方式啥的)发起Intent跳转到FlagActivity,为此我把它的export属性专门设为true了,所以是不需要frida的,甚至root都不需要 侃遍天下无二人 发表于 2024-2-25 16:18
简单题第二题我设计的后门是直接用第三方app(快速启动、快捷方式啥的)发起Intent跳转到FlagActivity,为 ...
啊 这个还真不知道,试一下秒出{:1_925:}
侃遍天下无二人 发表于 2024-2-25 16:18
简单题第二题我设计的后门是直接用第三方app(快速启动、快捷方式啥的)发起Intent跳转到FlagActivity,为 ...
第一题,第二题安卓看完代码直接am命令飞过去就行,不用三分钟;www 现在又发现web题 4、5、9的一招秒办法:
在源码中,将style下面body背景的white改为black
然后细微调整一下窗口宽度,效果如下:
页:
[1]