算法实现
编程之法:面试和算法心得
稀疏文件读取(sample:Test_your_nc,BJDctf-2020):off_t lseek(int fd, off_t offset, int whence);
当whence=SEEK_DATA(3)是跳过hole寻找下一个数据,SEEK_HOLE(4)是跳过数据寻找下一个hole。
辅助命令
1 |
|
隐写分析
双图
1 |
|
单图
隐形水印工具(须在虚拟机运行)
png
1 |
|
色彩类图片:npiet图片编程语言
jpg
1 |
|
qrcode
qrazybox,数出需要复原qrcode的尺寸,新建项目后,在Editor Mode中选择对应的尺寸,然后,对照着把黑色块点出来,再在Decode Mode解码。
微微二维码,批量解二维码。(sample:九宫格,网鼎杯-2020朱雀组)
bctester,导出二维码中二进制。
mp3
1 |
|
- audacity:点击向下箭头,选频谱图,频谱图设置(调整最低最高频率)
- silenteye
- MPEG_FRAME->MPEG_HEADER有一位private_bit是保留位可以用于隐写(sample:private,xiangshan-2022)
wav
steghide extract -sf miao.wav
gif
1 |
|
avi
docx
- ctrl+A全选->右键Font->Effects去掉勾选Hidden
- File->Options->Display->勾选Hidden text
- 使用7zip解压docx,在word/document.xml中查找
flash(swf)
1 |
|
web
- snow隐写
- 空字符加密:sample:babyweb,安恒202005月赛,
decoded = zwsp_steg.decode(encoded)
- 零宽度字符的Unicode隐写 https://www.mzy0.com/ctftools/zerowidth1/ https://330k.github.io/misc_tools/unicode_steganography.html https://yuanfux.github.io/zero-width-web/
- 韩文等各种编码:CyberChef,Text Encoding Brute Force,选Decode模式。sample:sqlmapHell,wangdingcup-2022白虎
rar
- 修改
RarBlockType
为FILE_OR_DIR(116)
:sample:Unpleasant_music,wdb3rd-2018
pyc
1 |
|
拼图
1 |
|
fillter(sample:pintu,春秋杯2022)
流量分析
Wireshark
filter写法的field字段不明确时,右键选中字段->作为过滤器应用->选中。
未知流量(安恒杯201810月赛)
统计->协议分级,发现Secure Socket Layer(ssl)协议
数据按Length排序,选择长度较长的,右键Leftover Capture Data->显示分组字节,发现类似:
1 |
|
1 |
|
Master-Secret log格式,save as->ssl.log
协议过滤处填ssl,过滤出ssl包,右键->协议首选项->Open Secure Sockets Layer Preferences,Secure Socket Layer页面,(Pre)-Master-Secret log filename选中ssl.log
非常简单的流量分析(安恒杯201902月赛)
统计->协议分级,发现Encapsulating Security Payload(ESP)协议
过滤http流量分析到有robots.txt,发现abc.html(也可以直接文件->导出对象->HTTP得到abc.html),得到:
1 |
|
协议过滤处填esp,过滤出ESP包,右键->协议首选项,选中Attempt to detect/decode encrypted ESP payloads,然后打开ESP SAs:
复制对应ESP SPI填好,Encryption处如果选DES-CBC不行,可以尝试TripleDES-CBC,Encryption Key填对应DES值,Authentication选HMAC-MD5-96,Authentication Key填对应md5值。
再过滤协议http,即可看到url带ascii码,解码即可。
DNS流量,stealer(DASCTF-202108)
D:\ctf\tools\web\Wireshark\tshark.exe -r misc_dump.pcapng -T fields -e dns.qry.name -Y "ip.src==172.27.221.13"> hex
键盘/鼠标流量,difficult_programming_language(HCTF-2018)
1 |
|
键盘格式:02:00:07:00:00:00:00:00
,数据长度为8个字节, 第一个字节为0x00或0x20表示原始击键;为0x01表示按下Ctrl,0x02时表示按下Shift。击键信息集中在第三个字节,表示每次key stroke产生一个keyboard event usb packet。根据键值对应表,查询对应字符。
鼠标格式:02:ff:01:00
,数据长度为4个字节 ,第一个字节代表按键,当取0x00时,代表没有按键;为0x01时,代表按左键;为0x02时,代表当前按键为右键。第二个字节可以看成是一个signed byte类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少像素,为负时,代表水平左移多少像素。第三个字节与第二字节类似,代表垂直上下移动的偏移。
MySQL流量:编辑->首选项->Protocol->MySQL,show SQL Query string in INFO
Not_Only_Wireshark(Redhat-2018)
1 |
|
ospf流量(wangdingcup-2022)
1 |
|
SYN半连接
1 |
|
分析哥斯拉、冰歇流量
jsp哥斯拉:AES ECB,gunzip
编码分析
emoji
sample:奇怪的组织,虎符杯2020
利用CyberChef对{"message":"🚄🏂🐙🐙💥⏰💥😓🐙💾","key":"😀"}
进行base64编码,拼接网址头部并进行url编码(+改%2B,否则默认会改成%20),得到:https://codemoji.org/share.html?data=eyJtZXNzYWdlIjoi8J%2BahPCfj4Lwn5CZ8J%2BQmfCfkqXij7Dwn5Kl8J%2BYk/CfkJnwn5K%2BIiwia2V5Ijoi8J%2BYgCJ9
,访问即可解。
Malbolge
采用ascii中所有(0x7e - 0x20 + 1 = 94)个非空字符进行编程,输入的字符和所在位置相加的值减33模94
1 |
|
只允许是:[6, 7, 29, 35, 48, 65, 66, 84]中的一个,对应xlat表中的字符:ji*p</vo
1 |
|
采用malbolge-interpreter可进行解码或运行程序:
1 |
|
键盘密码
Qwerty, Dvorak, Colemak, Workman and Russian keyboard(sample:Qweauty and the Beast,ez-ctf2022)
遍历破解
freq_game(HCTF-2018)
解法一:Fast Fourier Transformation(FFT,快速傅立叶变换)
1 |
|
解法二:遍历预生成查询表
从m种不同元素里,每次可重复取出n个元素组合,用的是隔板法。
设第i个元素取了xi次,则原问题相当于x1+x2+…+xm=n的非负整数解的个数,即y1+y2+…+ym=n+m(yi=xi+1)的正整数解的个数。用隔板法,将n+m个1分为n组,每组至少一个,相当于在所有1的n+m-1个空里插n-1个板子,因此总的情况数是
\(C_{n+m-1}^{n-1} =\frac{(n+m-1)!}{n!*(m-1)!}\)
因此从0x00-0xff共256种元素每次可重复取4个元素组合,共有情况:math.factorial(256+4-1) / (math.factorial(4) * math.factorial(256-1))=183181376
种。直接生成4个字节的原始表需要耗费大量时间和空间。
- 可以先生成256种元素每次可重复取2个字节和的原始表,由于计算方式相同,另两个字节和的值也可在此表查到,再通过反查表的方式(对于浮点数处理需要注意下一节提到的精度问题)确认剩下两个字节。
1 |
|
- 可以生成256中元素每次可重复取2个字节和的原始表,由于另两个和的值也可在此表查到,因此通过寻找和为定值的两个数算法可以确定哪两个和值之和为目标值。因为此处是计算之后的和值和目标值直接对比,不存在精度损失,无需考虑精度问题。
1 |
|
浮点数float处理
内部处理时默认保留15位小数,但直接print只会打印10位小数
1 |
|
进行相等比较时,只能考虑14位精度
1 |
|