有很多脑洞题,想了很久最后还是牢出来了.
在这里仅给出一部分我个人解出的题目的WriteUp.
Crypto:
DIladila:
爆破明文:
1 |
|
输出:
1 | Found match: Plaintext=72435F61 -> Cipher=(23B1, E072) |
转换:
1 | m = [0x67616c66, 0x756f597b, 0x6c49445f, 0x6c696461, |
flag{You_DIladila_Crypto_Matser}
古典密码:
线索:
qwertyuiopasdfghjklzxcvbnm一定是单表替换
字符串nxtcctf一定是维吉尼亚密码
数字5、8有可能是仿射密码(ctfwiki中给出的例子就是5、8)
数字4、5是什么?
第一步:变位密码的爆破
单表替换、维吉尼亚、仿射是不可能改变字符顺序的,因此密文中的两个{}一定是密码棒密码或者其他移位密码加密的结果
有一种可能,题目中未提及最经典的栅栏密码,加密过程中或许还有栅栏密码的参与,以及凯撒密码,这两者里面大概率有一个参与了加密。穷举单次密码棒密码加解密的结果,发现没有,编写脚本爆破:
1 | def se(plaintext, num_rows): |
认为空格属于密码棒密码的填充,发现有一个解刚好对上:
f___#_{}__g__l___#__#__#__a__#, lenm = 25, lenc = 30, arg = (7, 6), sese, del
用这组参数进行解密:
1 | def se(plaintext, num_rows): |
得到njih{ddolYScoikOWrlctrcc}
,看起来是对的
第二步:改变字符密码的爆破
目前已经有两层加密被用掉了,接下来剩下一个单表替换、一个维吉尼亚、一个仿射密码,和一个未知的古典密码(猜测是凯撒),这4种各1个
变位密码的位置会影响改变字符密码的结果,因此需要考虑更多的可能,需要考虑6!*26种情况(凯撒密码位移不确定)
经过大量尝试+爆破发现顺序是两个密码棒密码→密钥为nxtcctf的维吉尼亚密码→参数5,8的仿射密码→qwertyuiopasdfghjklzxcvbnm的单表替换→偏移量为23的凯撒密码,即可得到flag:flag{nxtcNBflagNBctfflag}
告白2009-01-23:
wiener攻击:
1 | import gmpy2 |
得到m = 634374818174323263916343,手机九键得到oisttseeowoi,键盘替换得到ihleelccibih,l改成d得到ihleedccibih,踢掉的两个变成空格得到ihleedcc ib ih,栅栏2栏得到ich liebe dich
德语“我爱你”:ich liebe dich
flag{ich liebe dich}
Reverse:
ezBase:
UPX被改成小写了,改回大写后脱壳
base64是魔改的,表是AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789+/
,末尾还异或了4,密文是iP}ui7siC`otMgA~h5o]Tg<4jPmtIvM5C~I4h644K7M~KVg=
,求得flag:flag{Y0u_@R3_Upx_4nd_b45364_m4st3r!}
hookme:
mainactivity有一段这个:
1 | publicstaticfinalvoid onCreate$lambda$0(EditText $inputField, MainActivity this$0, TextView $resultTextView, View v) { |
密文是correct_ciphertext,查找得到:<string name="correct_ciphertext">f235b888b3f4e08bff17e7e29bc3bf67d0f9a1b7b6581bb4a1eb299684e99923a8d193caf91d</string>
因为rc4是流加密,所以我们并不需要去hook native层,仅需要hook encryptedData即可,hook脚本:
1 | Java.perform(function () { |
frida -UF com.example.hookme -l hook.js,输入很多个1后得到密文:
1 | [*] rc4Encrypt 被调用,输入: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 |
将密文异或0x31即可得到密钥流:
9459d9efc89185b29975d7d4a9f58d53b3c8c482846f7dd5c3d81ff2b788ab149ce9a7aec860d7ed53313b36e2cf0ac59c67612f60c397298bdc180ab31fb3607bdcc8bae7d73a82d623948a75671bdfbd646790815b11ae3664
密文异或密钥流得到flag:flag{ee9fb062624c1e527fab36d3a27484d1}
Matlab_SMC?:
程序最后的部分有一个ZIP文件,提取里面有一个encrypt_flag.m
,但是已经被编译了,没法逆,运行程序发现加密是单字节的,而且与位置无关,与x或者y也无关,考虑找关系:
m | c | delta |
---|---|---|
0 | 1 | 0 |
1 | 8 | 7 |
2 | 25 | 17 |
3 | 52 | 27 |
4 | 89 | 37 |
5 | 136 | 47 |
6 | 193 | 57 |
7 | 260 | 67 |
8 | 337 | 77 |
9 | 424 | 87 |
10 | 521 | 97 |
11 | 628 | 107 |
可以发现对于整数是差值7、17、27、37、47….的数列,通项公式为5n²+2n+1,带入负数和小数试试,发现全部吻合,编写python脚本求原值:
1 | import openpyxl |
据此可以还原原来的表格:
单品名称 | 定价 | 日补货量 | 原定价 | 原日补货量 |
---|---|---|---|---|
菠菜(份) | 24.890125 | 214.0045 | 1.995 | 6.33 |
高瓜(2) | 1084.192 | 6.9605 | 14.52 | 0.91 |
海鲜菇(包) | 89.210125 | 454.9045 | 4.005 | 9.33 |
红椒(2) | 876.626125 | 26.338 | 13.035 | 2.06 |
红薯尖 | 157.6 | 101.152 | 5.4 | 4.28 |
洪湖藕带 | 9833.195125 | 88.162 | 44.145 | 3.98 |
姜蒜小米椒组合装(小份) | 66.866125 | 236.7845 | 3.435 | 6.67 |
金针菇(盒) | 83.6245 | 1423.7845 | 3.87 | 16.67 |
净藕(1) | 939.25 | 190.528 | 13.5 | 5.96 |
菱角 | 778.3045 | 14.7445 | 12.27 | 1.47 |
螺丝椒 | 589.4125 | 229.9645 | 10.65 | 6.57 |
螺丝椒(份) | 72.431125 | 685.25 | 3.585 | 11.5 |
木耳菜 | 212.05 | 196.738 | 6.3 | 6.06 |
奶白菜 | 261.442 | 192.3805 | 7.02 | 5.99 |
七彩椒(2) | 968.2405 | 10.882 | 13.71 | 1.22 |
上海青 | 578.075125 | 63.1045 | 10.545 | 3.33 |
双孢菇(盒) | 157.6 | 538.4845 | 5.4 | 10.17 |
娃娃菜 | 205.280125 | 647.1845 | 6.195 | 11.17 |
芜湖青椒(1) | 516.928 | 1003.328 | 9.96 | 13.96 |
西兰花 | 987.110125 | 724.4045 | 13.845 | 11.83 |
西峡花菇(1) | 2248 | 102.05 | 21 | 4.3 |
苋菜 | 182.002 | 451.1005 | 5.82 | 9.29 |
小米椒(份) | 246.5005 | 2284.1845 | 6.81 | 21.17 |
小青菜(1) | 299.5645 | 132.3845 | 7.53 | 4.93 |
小皱皮(份) | 65.2405 | 685.25 | 3.39 | 11.5 |
蟹味菇与白玉菇双拼(盒) | 591.041125 | 8 | 10.665 | 1 |
云南生菜 | 529.192 | 23.9125 | 10.08 | 1.95 |
云南生菜(份) | 71.8645 | 5079.2845 | 3.57 | 31.67 |
云南油麦菜(份) | 87.328 | 2178.5845 | 3.96 | 20.67 |
长线茄 | 1230.112 | 67.4125 | 15.48 | 3.45 |
枝江青梗散花 | 257.128 | 33.058 | 6.96 | 2.34 |
竹叶菜 | 125.051125 | 921.5245 | 4.785 | 13.37 |
紫茄子(2) | 504.808 | 555.2045 | 9.84 | 10.33 |
平均值 | - | - | 9.493182 | 8.346364 |
最后一行求得平均值9.493,8.346,计算md5,flag{7ce3c18d1e03070c79cf5074a195a240}
你知道Base么:
main:
1 | int __fastcall main_0(int argc, const char **argv, const char **envp) |
题目分3个阶段,首先要通过TEA得到RC4的密钥,然后通过RC4得到base64表,最后解码base64得到flag,编写脚本:
1 | def TEA_DEC(dwordenc, dwordkey): |
flag{y0u__rea11y__k1ow__Base!}