做题一时爽,期末火葬场,一晚上水了三题,跪求期末不挂,老老实实去复习。祝各位表哥冬令营玩的开心。
中二的成长之路
很容易发现图片本身就是个压缩包,里面还有个图片,但是加密了
所以需要我们求出压缩包的密码。
观察图片,有个二维码,扫描得到密文3ukka4wZf2Q9H8PEI5YKFA==
继续观察图片
- 有红色字样,写着aes,说明是AES加密
- 有黑色加粗字样,写的QR,猜测key值与QR有关,后来根据题目提示,key应该是QR的MD5值
写脚本解密密文
-
from Crypto.Cipher import AES import binascii import base64 obj2 = AES.new('66c35cd8077f7e1db5faefbc048a646a', AES.MODE_CBC,' ') print obj2.decrypt(base64.b64decode('3ukka4wZf2Q9H8PEI5YKFA=='))
|
得到压缩包密码1Znmpr4jzChwxXqB,解密压缩包,得到另一个二维码
扫描得到密文bqIGBfOGuOsxLYV16OI7xRNAZrcFdYLJtHaDym2O7so=,
还是同样的套路,aes解密,其中aes的key是图片的名字s776051080zum92N,要注意的是这个密文包括了两段aes,分别解出XCTF{W0W_U_G0T_T和H3_FL4G},连在一起就是flag。
返老还童
大概看一下源码,发现密文格式是xxxx-xxxx-xxxx-xxxx,根据’-‘符号把密文分成了四组。
先对密文做了检验,必须是大小写字母或数字。
主程序是一大段等式判断,把其中两位参数a、b传到check_flag.html并调用了o0O0oo0o0o0o0oO函数检验是不是满足条件,其中a要大于b,a小于100。
public static void b(String str) { String[] split = str.split("-"); char[] toCharArray = split[0].toCharArray(); char[] toCharArray2 = split[3].toCharArray(); if (toCharArray[0] == toCharArray2[1] - 3 && toCharArray[3] == ((char) (toCharArray2[2] | 1)) && toCharArray2[2] % 2 != 1) { a = toCharArray2[3] ^ 55; 91 108 l if (toCharArray2[2] == toCharArray[2] + (toCharArray.length * 2) && toCharArray2[0] == toCharArray[0] - (toCharArray.length / 2) && toCharArray2[1] == ((char) (toCharArray[3] ^ 18)) && toCharArray[1] * 2 == toCharArray[2] - 8 && toCharArray2[3] == toCharArray[2]) { toCharArray = split[1].toCharArray(); toCharArray2 = split[2].toCharArray(); if ((split.length * 3) + toCharArray[1] == toCharArray[3] && toCharArray2[1] * 2 == toCharArray[3] - 11) { b = (toCharArray[2] - toCharArray2.length) ^ 113; if (toCharArray[0] + toCharArray2[0] == 187 && toCharArray[0] + toCharArray2[3] == 210 && (toCharArray[3] ^ toCharArray[2]) == 47 && (toCharArray[0] ^ toCharArray[1]) == 15 && (toCharArray2[2] ^ toCharArray[1]) == 5 && a > b && a < 100) { MainActivity.b.getSettings().setUserAgentString(MainActivity.b.getSettings().getUserAgentString() + ";" + a + ";" + b); } } } //d2lu-bmVy-Y7hp-bgtl //100-50-108-117 //98-109-86-121 //89-55-104-112 //98-103-116-108
|
观察check_flag.html函数,
主要需要满足的条件是
a*a-b*b=8(a+b) a-b=8 a*a+a*b+b*b>10000 a*a+a*b-b*b>10000 gcd(a,b)=7
|
,写脚本爆破,发现就一组满足条件
根据a,b的值带入程序方程组很容易就能求出所有密文的值d2lu-bmVy-Y7hp-bgtl,即为flag。
神秘的TXT
发现有三个横坐标,三个纵坐标,因为是mobile题目,猜测对应着手机键盘密码。
因为不知道坐标顺序,所以把8种可能的反转情况都列出来,一个一个试,其中有一个是对的
XCTF{974856321} XCTF{932658741} XCTF{398652147} XCTF{178452369} XCTF{712458963} XCTF{314256987} XCTF{136254789} XCTF{796854123}
|
好像是第四个,忘了。
Only when you plant the flowers can you really smell their fragrance.