NewStarCTF2023
Week 1
easy_RE
打开就是flag
咳
upx -d 解开后每个字符-1就得到flag
Segments
shift + f7
直接看到flag【自己拼接一下】
ELF
首先一个简单的xor 然后是一个base64
在线网站首先解开base64 然后再自己写py解开encode
1 | enc = "V\QWkt $_e'^_ggXQ'u|v!c/m" |
Endian
一个简单的异或,然后16进制转字符串的时候发现是小端序。改下顺序就好了
AndroXor
用jadx,找到后,就是一个简单的xor
1 | enc = [14, b'\r', 17, 23, 2, b'K', b'I', b'7', b' ', 30, 20, b'I', b'\n', 2, b'\f', b'>', b'(', b'@', 11, b'\'', b'K', b'Y', 25, b'A', b'\r'] |
EzPE
修改一下DOS头
1 | enc = [ 0x0A, 0x0C, 0x04, 0x1F, 0x26, 0x6C, 0x43, 0x2D, 0x3C, 0x0C, |
lazy_activity
直接搜索flag{
就找到了
Week 2
PZthon
python打包成的exe。用pyinstxtractor解开是一个pyc文件。然后就是一个简答的xor。
1 | enc = [ |
AndroGenshin
用jadx打开找到“MainActivity”很容易的看到是一个rc4后的base64。并且使用的是一个rc4加密的后的base64的表单。
所以解密比较简单。首先得到base64的表单。然后再base64换表,后解密。
1 | import base64 |
SMC
上来就看到VirtualProtect 。
下面有一个反调试。然后是一个解密的函数。然后再是调用函数。
思路1:动调调试,绕过反调试。然后运行解密函数,后停下来,让IDA重新去分析函数。
这里修改一下zf标志位。【绕过反调试】
当我们运行过解密函数后,就已经得到了正确的函数了。走到403040这个函数的时候F7进去。
按下“P”然后F5:
就得到了正确的函数。
思路2:
用IDApython实现解密函数。
1 | import idaapi |
一样能得到正确的函数。
然后就是有一个简单的解密了
1 | s=[0x7C, 0x82, 0x75, 0x7B, 0x6F, 0x47, 0x61, 0x57, 0x53, 0x25, 0x47, 0x53, 0x25, 0x84, 0x6A, 0x27, 0x68, 0x27, 0x67, 0x6A, 0x7D, 0x84, 0x7B, 0x35, 0x35, 0x48, 0x25, 0x7B, 0x7E, 0x6A, 0x33, 0x71] |
Petals
这个是一个jnz和jz组合而成的花指令。
找到位置后,讲jnz和jz下面的call指令的第一个字节改成90。然后就能看加密的函数了。
这里主要就是:*(_BYTE *)(j + a1) = *((_BYTE *)v5 + *(unsigned __int8 *)(j + a1));
我们知道a1 = 0xD0, 0xD0, 0x85, 0x85, 0x80, 0x80, 0xC5, 0x8A, 0x93, 0x89,
0x92, 0x8F, 0x87, 0x88, 0x9F, 0x8F, 0xC5, 0x84, 0xD6, 0xD1,
0xD2, 0x82, 0xD3, 0xDE, 0x87
这句话的意思就是说flag = v5[a1[j] % 256];
1 | enc = [0xD0, 0xD0, 0x85, 0x85, 0x80, 0x80, 0xC5, 0x8A, 0x93, 0x89, |
然后是一个md5
C?C++?
用dnSpy反编译C#
加密大概就是这样的,然后就是反着写:
1 | array = [68,75,66,72,99,19,19,78,83,74,91,86, |
R4ndom
这个题是一个伪随机【rand】
简单的看,就是flag和随机数进行一些操作。然后和内存中已经有的进行比较。
首先将要比较的数据弄出来:
1 | # 定义数据 |
主要就是这句话:(16 * ((unsigned __int8)(v3 + v4 % 255) >> 4) + 15) & (unsigned __int8)(v3 + v4 % 255)
如何得到v3的值。
最后借用了官方Wp:
1 |
|
easy_enc
这个题,简单的爆破就好了。
如下是我看了Wp,然后自己写的一些解释。
1 |
|
AndroDbgMe
一看题目就知道要dbg它。
我们这里用官方的wp解一次,因为之前没遇到过,所以我就详细的写。
首先将apk和apktools放在一起。
用APKtools解包:
java -jar apktool_2.9.0.jar d AndroDbgme.apk
得到AndroDbgme 文件夹。
打开里面的xml文件。
添加:android:debuggable="true"
重新打包,并且重新命名:
java -jar apktool_2.9.0.jar b AndroDbgme -o AndroDbgme_unsigned.apk
得到:AndroDbgme_unsigned.apk
这个apk文件。
对文件进行对齐:
zipalign -p -f -v 4 AndroDbgme.apk AndroDbgme_unsigned.apk
生成keystore
keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore
口令:123456。
得到了abc.keystore
签名:
jarsigner -verbose -keystore abc.keystore -signedjar AndroDbgme_unsigned_1.apk AndroDbgme_unsigned.apk abc.keystore
错误了
尝试一下:
apksigner sign --ks abc.keystore AndroDbgme_unsigned.apk
这样就是可以了的。
动态调试:
打开用jeb打开AndroDbgme_unsigned.apk。并且将这个文件安装到雷电模拟器中【要给root权限】,然后
之间debugger是找不到这个文件的。
打开这个文件后就能找到了。然后点击attach
就得到了flag
Week 3
花
这个就是一个比较简单的永恒跳转的jnz和jz
找到位置把下面的call的第一个字节nop掉。然后‘c’ ‘p’就能F5了
然后就是一个RC4
STL
pyexe
首先用了工具:“Skipping pyz extraction”
我们用相同版本的python来尝试一下:python3.8【用的主机】
报错了如上。
但是也生成了这个文件夹
然后将pycdc放在这个文件夹里面后:
【为什么我上面的路劲不一样,是因为我将它copy到了虚拟机里面】
得到key=‘00000000new1star'
然后用网上的脚本fix:我将他保存到了1.py里面
1 |
|
这里兜兜转转了好久好久,全是因为python版本的问题。【感觉是电脑有缓存,就很莫名其妙。重启一下虚拟机就好了】,我上面贴的图是在主机里面实现的,我在虚拟机里面安装好了python的版本,重启机子后也成功了。
现在来看代码来逆向:
这里就知道了base64
还有一个from setting import key
key == b'new_star'
1 | #最后抄了一个wp:我大致都理解了,但是不知道为什么有个md5 == |