1、misc
(1)Misc1
下载附件,压缩包里面有两张jpg图片
解压后习惯性的放进kali里面分析一下,没有隐藏文件
放到Stegsolve里分析,因为是两张一样的图片,combiner也没啥发现
分别对两张图片单独分析也没有发现任何有用的信息
用010editor打开 hint.jpg ,在结尾发现了一串编码
5L2g5LqG6KejcHlj5paH5Lu25ZCX77yf
放入随波逐流发现是base64
解码得到
你了解pyc文件吗?
(pyc文件反编译可以得到py文件)
但是目前附件里并没有发现pyc文件
于是我又将没解压前的原始压缩包放进kali分析
依旧没有得到什么新的东西
再次使用010editor打开另一张图片 secret.jpg
也是在结尾找到一串字符
bw0NCgAAAABFNylkvgAAAOMAAAAAAAAAAAAAAAAAAAAABAAAAEAAAABzQgAAAGQAWgBkAVoBZQJkAoMBRABdDloDZQRlAWUDFwBkAxYAgwFaBWUAZQU3AFoAcQhlBmQEZQAXAGQFFwCDAQEAZAZTACkH2gDpYwAAAOkgAAAA6YAAAAB6BWZsYWd7+gF9TikH2gRmbGFn2gNrZXnaBXJhbmdl2gFp2gNjaHLaA3RtcNoFcHJpbnSpAHINAAAAcg0AAAD6B3Rlc3QucHnaCDxtb2R1bGU+AQAAAHMMAAAABAIEAQwBEAEKARQB
放进随波逐流
解了个base92出来
将这段信息存为.pyc文件,尝试去进行反编译
但是一直报错,无论是用软件还是网站都不行
尝试换了很多个网站都不行
然后去搜索图片和pyc之间的东西,发现了另外两个方向
第一个是Python可以将图片转成.py文件
但是我Python安装本身存在一些问题,看它那个代码也不太明白,就没去试这个方向
第二个是在pyc文件中嵌入信息
Stegosaurus 是一款隐写工具,它允许我们在 Python 字节码文件( pyc 或 pyo )中嵌入任意 Payload。由于编码密度较低,因此我们嵌入 Payload 的过程既不会改变源代码的运行行为,也不会改变源文件的文件大小。 Payload 代码会被分散嵌入到字节码之中,所以类似 strings 这样的代码工具无法查找到实际的 Payload。 Python 的 dis 模块会返回源文件的字节码,然后我们就可以使用 Stegosaurus 来嵌入 Payload
然后我去下了个 stegosaurus,对刚才的pyc文件分析
但是也没有什么发现,提示未知的代码类型
我还对这两张图片取异或后的数据进行过分析,但是看到一片黑
如果全黑代表着两张图片一模一样每一个字节都一样(因为异或运算,00为黑)
但其实还是有一定差别的,通过导出的数据来看
存为pyc文件去反编译但是也是不行的
后面将字符串使用在线网站进行base64解码,出现了乱码
这也是为什么前面在随波逐流中没有显示base64的结果
同样是将解码的结果存为pyc文件进行反编译,依旧是报错或者没结果
后面去找这个报错的原因
Invalid pyc/pyo file - Magic value mismatch!
发现这个是因为每个 .pyc 文件都有一个magic head,PyInstaller 生成 .exe 的时候会把 .pyc 的 magic 部分去掉,在反编译的时候需要补齐。
于是去找了个文件头给它补了一下,但是反编译出来没有任何结果,是一个空文件
后面换了好几个base64解码的网站,终于找到了一个好用的:CyberChef
这个网站可以直接将结果存为文件,这里我们直接存为.pyc文件
再对这个pyc文件反编译
得到Python源码
#!/usr/bin/env python # visit https://tool.lu/pyc/ for more information # Version: Python 3.10 flag = '' key = 99 for i in range(32): tmp = chr((key + i) % 128) flag += tmp print('flag{' + flag + '}')
运行代码
直接拿到flag
flag{cdefghijklmnopqrstuvwxyz{|}~}
但是这里最后结果多出了一些东西,删掉即可
最终flag为
flag{cdefghijklmnopqrstuvwxyz{|}~}
(2)Misc2
附件打开是usb流量
在CTF中USB流量分析主要以键盘和鼠标流量为主,前者数据长度为八个字节,后者则为四个字节
wireshark打开我们可以发现它是八个字节,所以是键盘流量
使用kali中的tshark 命令把cap data提取出来
tshark -r usb.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt //提取并去除空行
但我们发现提取出来的数据并没有带冒号
使用脚本给它加上冒号
f=open('usbdata.txt','r') fi=open('out.txt','w') while 1: a=f.readline().strip() if a: if len(a)==16: # 鼠标流量的话len改为8 out='' for i in range(0,len(a),2): if i+2 != len(a): out+=a[i]+a[i+1]+":" else: out+=a[i]+a[i+1] fi.write(out) fi.write('\n') else: break fi.close()
编好后使用./直接运行,发现权限不够,加权后运行还是报错
我们使用Python3来运行,成功将冒号加上去了
使用脚本还原键盘流量对应的信息
normalKeys = { "04":"a", "05":"b", "06":"c", "07":"d", "08":"e", "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j", "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o", "13":"p", "14":"q", "15":"r", "16":"s", "17":"t", "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y", "1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4", "22":"5", "23":"6","24":"7","25":"8","26":"9", "27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t", "2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\\", "32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".", "38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>", "3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>", "44":"<F11>","45":"<F12>"} shiftKeys = { "04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J", "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T", "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$", "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")", "28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>", "2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":"\"", "34":":","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>", "3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>", "41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"} output = [] keys = open('out.txt') for line in keys: try: if line[0]!='0' or (line[1]!='0' and line[1]!='2') or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0' or line[6:8]=="00": continue if line[6:8] in normalKeys.keys(): output += [[normalKeys[line[6:8]]],[shiftKeys[line[6:8]]]][line[1]=='2'] else: output += ['[unknown]'] except: pass keys.close() flag=0 print("".join(output)) for i in range(len(output)): try: a=output.index('<DEL>') del output[a] del output[a-1] except: pass for i in range(len(output)): try: if output[i]=="<CAP>": flag+=1 output.pop(i) if flag==2: flag=0 if flag!=0: output[i]=output[i].upper() except: pass print ('output :' + "".join(output))