[RCTF 2024] Misc
Logo: 2024
len(ROIS_LOGO) * .2024 = 449.5304
default_guarded_getitem # No restrictions可以getattr
也就是把代码长度限制在449以下,可以考虑对 logo 这样加密:
- 除去所有换行符,这样就只有空格和#了
- 把所有连续的同种字符的个数记录,变成列表。这样的话,列表中第1个数是#的,第2个数是空格的,第3个数是#的,依次类推。
- 把这个列表中每个数和96(0x60)异或,变成bytes,这样大部分都是可见字符,减少长度
这样得到下面的l(为了使得l的长度是偶数,最后加上了一个x60,异或回去表示0个字符,不会有影响),解密即可。
l=b'\xe0aaa)cbgkababjkshmjcbkiojsfrgchghezdmdldfckefdkcndldvdmdedkdmdldvdncddmcmcmdvdndcdmdlcnetdndccoclcofrdncdcoclcqfpdmddcockdtfmdldecockdvelddkfcndkdxejddihdmdkdzdididicmcldzdidjdhdkcmdzdidkdhdidmdmdididlciefclgoedejcnakilrikma\x7fbNd\x10\x60'
a=''
i=0
c=0
while i<len(l):
a=a+'#'*(l[i]^96)+' '*(l[i+1]^96)
i=i+2
i=100
while i<len(a):
a=a[:i]+'\n'+a[i:]
i=i+101
logo=a
s1ayth3sp1re
Score>3000 to obtain a flag
找到关键部分
写出解密脚本
public class Main {
public static void main(String[] args) {
int[] iArr = {164, 158, 95, 107, 4, 215, 108, 115, 5, 8, 25, 57, 41, 236, 231, 17, 85};
int[] iArr2 = {246, 221, 11, 45, 127, 148, 45, 36, 70, 73, 78, 8, 98, 141, 140, 112, 40};
String str = "";
for (int i = 0; i < iArr.length; i++) {
str = str + String.valueOf((char) (iArr[i] ^ iArr2[i]));
}
System.out.println(str);
// RCTF{CAWCAW1Kaka}
}
}
Find a Hacker
翻了一堆东西(扫文件,剪贴板,浏览器balabala)然后走投无路跑了下进程,发现一个idaq64.exe和一个poner.exe,给ida的进程memdump下来放进gimp里一通爆查
idaq64.exe:
poner.exe
0x7e577070 \Users\Administrator\Desktop\enc.til 216
0x7e578330 \Users\Administrator\Desktop\enc.i64 216
拿到了一个二进制,打开ida稍微分析一下,即可写出exp
>>> a = bytes.fromhex("0C0F2B486F5D46536459594B5F475B5B6B5F15165D12766B071B334A67071100")
>>> b = bytes.fromhex("353F4E2B566B746A5D6D6F736C773868596E20213C714F09367D557251322766")
>>> for i in a:
... print()
KeyboardInterrupt
>>> for i in range(32):
... print(chr(a[i] ^ b[i]),end='')
...
90ec9629946830c32157ac9b1ff8656f
# 题目没说加RCTF前缀,加上后对了
RCTF{90ec9629946830c32157ac9b1ff8656f}
评论已关闭