ByteCTF
被师傅们带飞呜呜呜,只拿了一个一血
Checkin
Description
字节跳动安全系列活动主题名字是什么?你造吗?关注【字节跳动安全中心】公众号并回复本次大赛主题(4字),会有意外惊喜!
Analyze
公众号发”安全范儿“
flag
ByteCTF{Empower_Security_Enrich_Life}
frequently
Description
Someone wants to send secret information through a surreptitious channel. Could you intercept their communications?
Analyze
一个流量包,里面有很多加密流量,但是并没有什么乱用,信息都在dns中,首先过滤器dns,发现
然后我们加个过滤IP,只需要发送端的
dns && ip.src == 10.2.173.238 && ip.dst==8.8.8.8
另存为12.pcap,tshark提取数据,
tshark -T fields -r 12.pcap -e dns.qry.name -e dns.id > q.txt
因为里面有些id是相同的,存在重传,这里脚本梭一下
import re,base64
f = open('q.txt','r').read().split('\n')
# print(f)
ff = []
for i in f:
if i not in ff:
ff.append(i)
res = ''
for ii in ff:
data = re.findall(r'(.*?)\.bytedanec\.top',ii)
if len(data) != 0:
if len(data[0]) >2:
res += data[0]
print(res)
f2 = open('out1.png','wb')
dd2 = base64.b64decode(res.encode())
f2.write(dd2)
f2.close()
但是出来的图片并没有什么卵用
我们还可以看到里面有许多的o和i组成的脏数据,这里全部提出来后转2进制,o对应0,i对应1,
import re
from Crypto.Util import number
f = open('q.txt','r').read().split('\n')
# print(f)
ff = []
for i in f:
if i not in ff:
ff.append(i)
res = ''
for ii in ff:
data = re.findall(r'(.*?)\.bytedanec\.top',ii)
if len(data) != 0:
if len(data[0]) <2:
res += data[0]
print(number.long_to_bytes(int(res.replace('o','0').replace('i','1'),2)))
得到b'The first part of flag: ByteCTF{^_^enJ0y&y0ur'
的前半部分flag,后半部分在流量包的udp的第一个流中
稍微读读写写得到flag
flag
ByteCTF{^_^enJ0y&y0urse1f_wIth_m1sc^_^}
BabyShark
Analyze
和114爷一起做的,根本不会做呜呜呜
首先给出pcap文件,tcp.stream eq 0找到adb tcpip安装apk的数据包。adb tcpip协议中有些命令混进去了,要删掉才能得到正确的apk。
整一个安卓手机连上adb tcpip,使用adb install test.apk安装apk,本地抓包,测试得知WRTE命令一共24个字节,所以导出tcp.stream eq 0,搜索WRTE,删除所有的WRTE和之后的20个字节
再删除头尾的CMD、OKAY命令,得到一个apk包。(此时已经能用7zip打开并提取dex查看,由于某些原因apk的zip的末尾存在半个zip,导致apk签名错误,删掉之后可以得到签名正确的apk包)
jadx打开dex得知,解密flag的逻辑是,从/sdcard/PBClass.dex
加载com.bytectf.misc1.KeyPB
类,从http://192.168.2.247:5000/api
得到一个byte[]数组,传入KeyPB的某个方法得到某个对象,然后调用这个对象的getKey方法得到long类型的密钥,最后使用密钥解密字符串AesUtil.decrypt(密钥, "8939AA47D35006FB2B5FBDB9A810B25294B5D4D76E4204D33BA01F7B3F9D99B1");
为flag。
从pcap文件中找到/api的返回值。08 8B B7 BD F5 DB D5 37 11 A1 F8 31 E6 D6 1C C8 40
拿不到/sdcard/PBClass.dex,只能猜PB代表什么,不是P**nhuB,fuzz得知为protobuf格式,使用cyberchef解密得到long类型的密钥244837809871755L
。From Hex, Protobuf Decode - CyberChef (gchq.github.io)Protobuf_Decode('',false,false)&input=MDggOEIgQjcgQkQgRjUgREIgRDUgMzcgMTEgQTEgRjggMzEgRTYgRDYgMUMgQzggNDA)
然后据此根据反编译源码写出exp:
import com.bytectf.misc1.AesUtil;
public class exp {
public static void main(final String[] args) {
final String flag = AesUtil.decrypt(244837809871755L,
"8939AA47D35006FB2B5FBDB9A810B25294B5D4D76E4204D33BA01F7B3F9D99B1");
System.out.println(flag);
}
}
直接输出flag得到flag:
flag
ByteCTF{Tr4ff1c4nalys_i5@Us3fu1}
HearingNotBelieving
Description
Hearing is not believing
Analyze
前面的是频域图中有二维码,截图后手拼下得到前半段flag
扫描得到m4yB3_
然后后面的稍微听一下就知道是robot36的音频,手机上放着然后导出,然后用ppt拼图,得到另一半flag的png
处理下扫描得到后半段flag:U_kn0W_S57V}
flag
ByteCTF{m4yB3_U_kn0W_S57V}
Lost Excel
Description
Please find out who leaked this document asap
Analyze
首先excel解压,里面媒体文件夹有一张图,用stegsolve可以看到里面有
然后里面的间隔可以看到很有规律,再根据提示,我们可以知道他的一块是8,所以说我们可以看到4块像素为一组,这里我们先处理下原图image1.png
from PIL import Image
import numpy as np
p = Image.open('image1.png').convert('L')
a,b = p.size
p1 = Image.new('1',(a,b))
for y in range(b):
for x in range(a):
if p.getpixel((x,y)) == 254:
p1.putpixel((x,y),1)
p1.save('1.png')
得到
然后看图看了半天,发现他竖着存在一个循环
然后我们四个像素块提一下,发现他图像只存在
白黑 黑白 黑黑 黑黑
黑黑 黑黑 白黑 黑白
四种情况,猜测这里可能是四进制,写下脚本
from PIL import Image
from Crypto.Util import number
p = Image.open('13.png').convert('1')# 13是循环图片
a,b = p.size
res = ''
for y in range(0,b-7,8):
for x in range(0,a-7,8):
data = [p.getpixel((x,y))//255,p.getpixel((x+4,y))//255,p.getpixel((x,y+4))//255,p.getpixel((x+4,y+4))//255]
if 1 in data:
res += str(data.index(1))
else:
continue
print(number.long_to_bytes(int(res,4)))
得到
b'el{t}deFyMdcTBWixC\x00nHEe'
没什么用,然后换1.png跑了下试试
from PIL import Image
from Crypto.Util import number
p = Image.open('1.png').convert('1')
a,b = p.size
res = ''
for y in range(0,b-7,8):
for x in range(0,a-7,8):
data = [p.getpixel((x,y))//255,p.getpixel((x+4,y))//255,p.getpixel((x,y+4))//255,p.getpixel((x+4,y+4))//255]
if 1 in data:
res += str(data.index(1))
else:
continue
print(number.long_to_bytes(int(res,4)))
得到flag
flag
ByteCTF{ExcelHiddenWM}