1-4 生
考点:
upx
出题思路:
upx改壳+循环自异或逻辑 第一周压轴应该没啥问题
wp:
upx改壳

直接脱壳会有报错 这里有两种做法 看做题人学习的时候会学到哪个
依靠工具的就是去修正标志位


如此修正便可以机脱
另一种方法是手托 可以用x64dbg 也可以直接用ida动态去看(如果是ida动态看的话 就比较吃基础了) 这里手托的方法就不放在wp里了 不会的新生在新生赛结束后来问学长就行
那么脱壳之后就是找到main进行分析

简单的重命名一下 最后enput与flag进行比较 enput由input加密得到 所以所需要的输入时flag 解密 得到正确input 长度30位

分析加密 输入和下一位异或 最后一位和第一位异或 那么复原的时候就是先让最后一位和第一位异或得到最后一位 再从后往前 每一位和下一位异或
convert提取flag 解密即可获得
1 | #include<stdio.h> |
这里之所以最后加一个0 是因为%s是读取到0暂停 如果不加截止字符 会输出其他东西
源码
upx+简单异或
1 |
|
wp
2-1 嗔
考点:
elf + md5爆破
出题思路:
限制输入长度在三字节且是字母 简单编写一个脚本爆破md5获得key 调试或者运行可以自解密输出flag
wp:
elf文件 拖入ida分析

输入的是key 经过checkkey函数

这里checkkey先判断长度是否为3 在判断每一个都是否是在a-z之间 最后返回整体的结果
后续是md5加密 md5加密不可逆所以要编写爆破脚本或者在线网站

获得key是ipu key输入正确后会自解密输出flag 这里提示说了 运行即可获得 那么就是虚拟机运行得到flag

wllmctf{Wo0o0oW!Md5_&nd_El7_You_a1l_Defe@t_!t}
源码
1 |
|
2-2 妄
考点:花指令 + rc4
出题思路:
本题提示很多 所以花指令个数会增加 不过都是简单花指令 分析汇编去掉即可
wp:
拖入ida

一开始有提示 运行获取hint 那么运行一下

大段的提示就是再说 花指令爆红原理 那么要分析汇编去除
回到题目 获取到输入后现有一个sub_401480函数 点进去发现是爆红的了 这时候就要分析汇编了

这里很明显是跳到loc_4019C4+1的位置 也就是说call的E8实际上是被跳过了 那么u重定义 ctr+n快速nop修掉

于是得到2025wllm 紧接着是sub_401870函数 这里第一二个参数是输入和输入长度 三四参数是key和key长度
进去看到三个未知函数

先将v5赋值0第一个函数点进去

简单分析发现是永真跳 那么这里还是要nop第一个字节

这里可以选择整理一下函数 点击一下函数名字 然后y重定义 将返回值类型改成void 然后点击a1 这里很明显 a1是字符串 所以改成char* 的定义

这样就十分好看了 就是将传入的参数赋值0-255
这里我将函数名命名为initbox 同时将前面的v5命名为box 因为这明显是一个很大的盒子 后续可能是通过盒子进行加密
第一个函数分析完毕 分析第二个

可以先假设zf是1 那么第一个jz要跳转到jz那里 然后第二个jz依然会跳走 可以看出来loc_401021这里是十分有争议的 可以先u转换为无定义

无定义后发现22和25这两个地方是指令 E8是完全被忽略掉的 所以可以nop掉然后将后面换成指令 这里换成指令会发现后面又爆红了 咱们把后面u掉

这样看就很明显的25前的E8没用 nop掉

长得很丑 修一修

因为看函数传入参数会发现 a1和a2分别是key和box 所以定义需要修成char 那么这里还会有unsigned _int8其实是因为这个定义是unsigned char* 按\健可以隐藏掉 那么这里最后会变成这样

还有个函数点进入

还是花指令 分析一下 最开始xor eax, eax eax就变成0了
然后eax+1+2=3 之后第一次的比较结果肯定是不跳转 3*3=9 9-2=7 7^8=15 15&11:
1111
1011
1011 = 11 所以这里的结果还是不等于 但是不等于会跳转回去 这时候在11的基础上+3是14 那刚好是E就跳转了 所以这里实际上就是通过复杂计算骗过ida来造成花指令
所以去掉花指令+修复后得到函数

也就是两个参数互换值

那么再回到这个函数 大家在逆向分析的时候采取一个取巧的思路 这里传入的是key和box 也就是说对输入的本身是完全没有影响的 所以不需要逆向获取解密 这里分析过其实会发现 最终真的发生了实际变化的只有盒 因为等式右边的操作都是临时的 不会对本身操作的比如说
b=1 a=b+1 这个过程中b变了吗 显然是否定的 那么我们可以把这个函数命名为changebox
那么就差最后一个函数了
、
这里和前面两段jzjnz有点像 这里也可以先假设 假设eax是0那么他就直接跳转到D7 如果他不是0那么会跳转到归0的地方 再回来 那么回来之后就是0了 就可以跳转了

去掉花再修复就变成这样子 这里其实对加密真正变化的就是^= 所以这里完全可以运行的时候dump下来异或的对象 也可以将前面的操作复现出来 然后^
还有种更简单的 因为这个加密的本质就是异或 而异或是可逆的 所以完全可以将flag直接patch掉输入得到flag 这里我用最后一种做法
这里flag的长度是38位 先填充38位东西

断点下在加密前 然后patch即可

得到wllmctf{B4by_RC4_@nd_Beautifu1_7lower}
源码
1 |
|
3-2 爱
考点:js
出题思路:
一个听音乐的js 一个检验key一个flag aes+des+js 其他的啥也没加了
wp:
拿到题之后先解压 打开Listen_music.html 这里有准备好的几首歌 可以放着听着做喜喜

打开音乐选择界面 感觉还算明显的try to click me
点开后

打开后是人机验证 这里直接F12看源代码

script下的都是 可以通过ctrl+F找到具体代码位置 其实看名字也能猜出来了 在check里面

获取输入框的内容 创建一个encrypto的对象 新生可能不是很了解对象 其实就是让这里可以调用到encrypto.js的函数 这里后面立马有enxor函数的调用

异或0x72 密文是3b1f1c1d06101d06 所以直接得到bot的话是Imnotbot并且后面还有一个setdeskey 函数作用是将this.key赋值Imnotbot 前面constructor给ai分析也能知道 是当这个js对象第一次被创建的时候被调用的 所以到现在为止就是给aeskey aesiv deskey赋值 后面跟着去分析会回到


这里先获取输入列表里的输入 然后aes加密+des加密 这里用到的key都在前面分析出来了 只需要解密即可 (这里有个小彩蛋 在music文件夹下 不仅有音乐还有一个hint)
这里用记事本打开会获得“这是js逆向 解密可以用Cyberchef哦”
所以cyberchef一把梭!

wllmctf{1_10v3_y0u_w15h_y0u_h4v3_m0r3_h4ppy_m3m0r135_1n_un1v3r517y}
4-2 痴
考点:smc+tea
出题思路:
smc+tes改 这里的tea稍微混淆了一下 合并几个同样的值其实就有了
wp:
拖进ida字符串定位到主函数慢慢分析就好不要着急


整体的去看把unk_140061560和v5的差值给v7后面同理给v8v9 v11
这里不要着急他什么意思往后去看v12 = v5 + 2 取v12[v8-2]首先要知道v12[v8 - 2]是等价于*(v12 + v8 - 2)的v8=&unk_140061560-v5代入
(v5+2+&unk_140061560-v5-2)=(&unk_140061560)
现在应该就清楚这里是做什么了把其实就是对unk_140061560数组进行异或v6那边也是同理的所以这里做的等价于
unk_140061560[i]^=aWllm[i%4];
后面基本上都一样的接着分析

写保护 注意开头的函数 其实就是刚刚异或的结果 v15赋值 然后调用异或结果 显然就是对 unk_140061560 SMC然后调用了后面就是验证了现在只差加密了
调试去看

看着难实际上合并合并是魔改xtea解密脚本如下
1 |
|
源码:
1 |
|
4-3 死
考点:
smc+tea
出题思路:
异常+rc4+模拟汇编执行
wp:
源码:
1 |
|