misc

图片

插入类隐写

1.base64

3.双图

binwalk

4.压缩包隐写

操作同上

5.

添加ff之后分离

LSB

1.

flag{AppLeU0}

叠加

exif

1.

属性

2.

gif

1.

分帧

png

1.

改宽高png

随波逐流

2.tweakpng

idat最后一块是加上去的,用binwalk分离,结果如下:

1.

转成图片结果如下

其他

1.bftools

E:\software\ctf工具箱\图片隐写\bftools\bftools.exe decode -o find braincopter E:\CTF\培训\图片隐写\图片隐写\6其他图片隐写\Bftools\steg16\flag.jpg

base64

2.F5

3.图层隐写

ffd9后面的文件分离创建成1.tiff,

仅看图层之后

文档类隐写

word

1.

取消隐写即可

2.

先扔随波逐流解除伪加密

然后解压之后把word解压发现图片

pdf

1.

扔到软件里去就ok了(不能有中文的路径)

压缩包

1.明文

用winrar压缩外面的文件、接着用软件爆破

音频

wav

1.

2.

莫斯电码

3.高低频

mp3

mp3

1.

一堆文件之后用命令直接合成mp3

ubuntu能直接看到这张图片,小金刚英文是GourdSmallDiamond,然后用指令decode

结果如下


binwalk mp3之后有个zip,解压即可。

磁盘

火眼打开分离出一个mp4

binwalk

把zip改成docx:

pyc

隐写

03F30D0AB6266A576300000000000000000100000040000000730D0000006400008400005A00006401005328020000006300000000030000000800000043000000734E0000006401006402006403006404006405006406006405006407006708007D00006408007D0100781E007C0000445D16007D02007C01007400007C0200830100377D0100712B00577C010047486400005328090000004E6941000000696C000000697000000069680000006961000000694C0000006962000000740000000028010000007403000000636872280300000074030000007374727404000000666C6167740100000069280000000028000000007307000000746573742E7079520300000001000000730A00000000011E0106010D0114014E280100000052030000002800000000280000000028000000007307000000746573742E707974080000003C6D6F64756C653E010000007300000000

然后16进制转成文件,反编译

流量

1.nctf

提取字符串

直接搜也行

2.

flag{backd00Rmate}

3.文件提取

length倒序看最大的包,然后

知道的tar.gz就直接搜文件头,然后另存

Reverse

1.静态分析

放入ida

1.flag{3fec4b

按X键可以看哪里调用了

输入每个字符的ascii码每个字符减10和/WY+X\(c语言:\表示\)比较,逆向回去:2.9ac5bf

同上,只不过是+10:pB;on@,减回去:3.**f81ed6**


alt+shift支持多行操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from string import printable
enc = [0]*6 #初始化数列
enc[0] = 0xEA
enc[1] = 0xD4
enc[2] = 0xF2
enc[3] = 0xDE
enc[4] = 0x1C
enc[5] = 0xCA
flag = ""
for target in enc:
for char in printable:
if((ord(char)*10))&0xff==target:
flag+=char
break
print(flag)

4.1bec6a

1
2
3
enc = ">i<k?o"
flag = "".join(chr(ord(c) ^ 0xA) for c in enc)
print(flag)

5.4c6a5e

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from string import printable
enc = [0]*6
enc[0] = 0xE4
enc[1] = 0x6C
enc[2] = 0xD0
enc[3] = 0x86
enc[4] = 0x72
enc[5] = 0x14
flag = ""
for target in enc:
for char in printable:
if((2 * ((ord(char) + 20) ^ 5) - 20))&0xff==target:
flag+=char
break
print(flag)

e1c42}

2.

H可以转换成16进制

R可以转换成字符

先把str2当中的o换成0,所以点进str2

flag{hell0_w0rld}

3.ezre

输入相同数即可

4.

U可以转换成非定义模式,按shift+E提取信息

1
2
3
4
5
6
7
8
enc = [0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
0x47, 0x32, 0x4F]
len_enc = len(enc)
for i in range(len_enc-1,0,-1):
enc[i] ^= enc[i-1]
print(bytes(enc))

for i in range(len_enc-1,0,-1):表示从len_enc-1开始循环到1(不包含0),步长为-1

5.动态调试Windows

先打断点

打断点(第一个断点为了演示用),开始本地调试

F7进入到函数、F8一步一步运行、F9运行至结束或断点

等程序运行好自解密看内存里的信息

6.Linux远程动态调试

打好断点

在dbgrsv界面打开之后输入chmod +x linux server64、用./linux_server64 192.168.50.128开始动态调试

先输入、之后程序就会把s自解密好,看内存即可,跟上面的一样

7.base_re

看代码发现发现base64

动态调试

打完断点看标准编码表的变化:

把这个表格

8.ez_xor

XOR函数:发现和9异或,异或回去即可

1
2
3
enc = "E`}J]OrQF[V8zV:hzpV}fVF[t"
flag = "".join(chr(ord(c) ^ 0x9) for c in enc)
print(flag)

8.找啊找

+-32对于ascii码就是大小写转换,加个异或

所以写代码转换回去:

1
2
3
4
5
6
7
8
9
10
11
12
13
enc = [ 0x50, 0x4A, 0x5A, 0x4D, 0x5F, 0x42, 0x7E, 0x76, 0x76, 0x5D,
0x18, 0x18, 0x08, 0x4A, 0x56, 0x66, 0x60, 0x56, 0x4C, 0x66,
0x5F, 0x08, 0x57, 0x5D, 0x66, 0x08, 0x6D, 0x66, 0x54, 0x79,
0x50, 0x57, 0x18, 0x18, 0x79, 0x44]
for i in range(len(enc)):
enc[i] ^= 0x39
if chr(enc[i]).isupper():
enc[i] += 32
elif chr(enc[i]).islower():
enc[i] -= 32
else:
continue
print(bytes(enc))

.isupper()函数不加()返回地址、加()返回TF

ISCTF{gooD!!1SO_yOU_F1ND_1t_M@IN!!@}

9.baseplus

base64+xor

1
2
3
4
5
6
enc = 'lvfzBiZiOw7<lhF8dDOfEbmI]i@bdcZfEc^z>aD!'
el = len(enc)
enc = [ord(i) for i in enc]
for i in range(el):
enc[i] ^= 0xE
print(bytes(enc))

解完用base64

10.xor

KeyStream生成密钥流,encrypt加密(对于输入的内容)

其实从这个代码来看,flag就是str也就是密文enc

这里*(_BYTE *)(输入 + i) ^= *(_BYTE *)(a3 - i - 1i64 + a1)

这个写的很丑,转成py代码即:输入[i] ^=密钥[28-i-1](循环28次)倒过来异或

细看encrypt由于异或可逆,意味着加解密的代码相同,所以解题策略有两个方法(一个是拷贝str的内容手动复现,另一个是动态调试、把v5内存里面的内容换成str,第一个代码是一样的,所以这里做第二个)

转到v5的地址,用下列代码把v5的东西换掉

记得把语言换成py的

1
2
3
4
5
6
7
enc = [ 0x01, 0x09, 0x05, 0x25, 0x26, 0x2D, 0x0B, 0x1D, 0x24, 0x7A, 
0x31, 0x20, 0x1E, 0x49, 0x3D, 0x67, 0x4D, 0x50, 0x08, 0x25,
0x2E, 0x6E, 0x05, 0x34, 0x22, 0x40, 0x3B, 0x25]
addr = 0x61FDE0
for i in range(28):
patch_byte(addr+i,enc[i])


修改完之后再运行加密

于是乎解密完成

BaseCTF{X0R_I5_345Y_F0r_y0U}