flag
{the_greatest_geek}
用stegsolve.jar
打开图片
,Analyse→Data Extract,分别选中R、G、B三种最低位,导出bin文件,分别得到
..... ..... ..... ..... !?!!. ?.... ..... ..... ..... .?.?! .?... .!...
..... ..... !.?.. ..... !?!!. ?!!!! !!?.? !.?!! !!!.. ..... ..... .!.?.
..... ...!? !!.?. ..... ..?.? !.?.. ..... .!.?. ..... ...!? !!.?! !!!!!
!!?.? !.?!! !!!!! !!!!! !!!.! !!!!. ?.... ..... ....! ?!!.? !!!!! !!!!!
!!?.? !.?!! !!!!! !!!!! !!!!! .!!!! !.!!! !!!!! !.... ..... !.!!! .....
..!.! !!!!! !!!!! !!!!! !!!.? .
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook! Ook. Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook?
Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook.
+++++ +[->+ +++++ ++ +++++ ++. ++++.-- .++++
++ +++++ +++.< +++++ +[->- ----- -- --.-- .---- -.++
+++++ ++ +.--- .---- -- ----- ----- ..--.
+++++ ++ +++++ +++++ +.++++ ++ .<
|
都是brainfuck以及其变种ook编码
打开
https://www.splitbrain.org/services/ook
即可分别解出,组成
flag
flag{db640436-7839-4050-8339-75a972fc553c}
图片中的二维码比较难扫描,若是扫描出来会得到
255
,也就是
0xff这个提示
第一步
:发现
文件尾部的大量0xff,编写脚本解0xff,之后binwalk检测下,
或者手动找到%png 位置,dump出来。
第二步
,
dump出图片,之后使用脚本获取黑白像素点,并还原成ascii码,得到flag
首先有个pcap数据包,打开就能看出,这是一个抓取usb协议的数据包,按lenth排序,看下长度比较大的几个包,可以找到3个文件,这是抓取的将文件复制到u盘上产生的数据包
分别为两个pcap文件和一个txt文件,我们可以将这些数据另存下来分析
其中,txt文件为提示的内容,文件大小不像前面两个pcap文件那么大,有的同学可能会忽略了
然后两个pcap包分别代表对usb键盘和usb鼠标的抓包结果。我们用
tshark
可以提取出来有用的字段
tshark -r usbkeyboard.pcap -T fields -e usb.capdata
第一个开头是10字节的数据,然后有一段8字节的数据,最后又是10字节的数据,这里10字节的代表捕获鼠标的数据,8字节的代表键盘的。我们写一个脚本提取出键盘敲击的字符。
mappings = {
0x
04
:
"A"
,
0x
05
:
"B"
,
0x
06
:
"C"
,
0x
07
:
"D"
,
0x
08
:
"E"
,
0x
09
:
"F"
,
0x
0A
:
"G"
,
0x
0B
:
"H"
,
0x
0C
:
"I"
,
0x
0D
:
"J"
,
0x
0E
:
"K"
,
0x
0F
:
"L"
,
0x
10
:
"M"
,
0x
11
:
"N"
,
0x
12
:
"O"
,
0x
13
:
"P"
,
0x
14
:
"Q"
,
0x
15
:
"R"
,
0x
16
:
"S"
,
0x
17
:
"T"
,
0x
18
:
"U"
,
0x
19
:
"V"
,
0x
1A
:
"W"
,
0x
1B
:
"X"
,
0x
1C
:
"Y"
,
0x
1D
:
"Z"
,
0x
1E
:
"1"
,
0x
1F
:
"2"
,
0x
20
:
"3"
,
0x
21
:
"4"
,
0x
22
:
"5"
,
0x
23
:
"6"
,
0x
24
:
"7"
,
0x
25
:
"8"
,
0x
26
:
"9"
,
0x
27
:
"0"
,
0x
28
:
"n"
,
0x
2a
:
"[DEL]"
,
0X
2B
:
" "
,
0x
2C
:
" "
,
0x
2D
:
"-"
,
0x
2E
:
"="
,
0x
2F
:
"["
,
0x
30
:
"]"
,
0x
31
:
"
\\
"
,
0x
32
:
"~"
,
0x
33
:
";"
,
0x
34
:
"'"
,
0x
36
:
","
,
0x
37
:
"."
}
nums = []
for
line
in
data.split():
if
len
(line)
is
not
23
:
continue
nums.append(
int
(line[
6
:
8
],
16
))
output =
""
for
n
in
nums:
if
n ==
0
:
continue
if
n
in
mappings:
output += mappings[n]
print
output
最后提取出来为FLAG[U5B-KEY,因为键盘上各字母大写小写以及不同符号可能在一个键上,键盘输入时是按shift键切换的,所以在抓取的8字节键盘数据里面,第一字节为0x02的话,就代表按住shift按的这个键,所以前半段flag为flag{u5b_key
tshark -r usbmouse.pcap -T fields -e usb.capdata
第二包tshark提取出来都是8字节的数据,代表捕获鼠标的数据。之前提取的txt也有提示,只用关心第一个字节,有 0x00 0x01 0x02三种,其中当取0x00时,代表没有按键、为0x01时,代表按左键,为0x02时,代表当前按键为右键。0x00是没意义的,那么剩下鼠标的左键与右键的点击事件,正好对应0与1,或者1与0,反正就两种情况,写个脚本提取一下,再将01序列转换成字符串就是flag的下半段了
bin_flag =
''
for
i
in
data.split():
if
i[:
2
] ==
'01'
:
bin_flag +=
'0'
if
i[:
2
] ==
'02'
:
bin_flag +=
'1'
print
hex
(
int
(bin_flag,
2
))[
2
:-
1
].decode(
'hex'
)
输出bo4rd_m0use}
最后拼接上去得到flag:flag{u5b_keybo4rd_m0use}
#!/usr/bin/env python
import os
from hashlib import md5
# Step 1:
# find the key: print xash(chr(0) * 16, key)
# Step 2:
# find the first char of md5(key)
# Step 3:
# generate random string with length 15 and concatinate it with the the first char of md5(key)
def xash(data, xkey):
assert len(xkey) == 16
if len(data) < len(xkey):
data += md5(xkey).digest()[:len(xkey) - len(data)]
out = b''
for n in range(len(data)):
out += chr( ord(data[n]) ^ ord(xkey[n]) )
return out.encode('hex')
key = os.urandom(16)
const = os.urandom(15)
s1 = const
s2 = const + md5(key).digest()[0]
print xash(chr(0) * 16, key) == key.encode('hex') # Find the key
print xash(s1, key) == xash(s2, key)
|
import gmpy
# p and q are primes so these equality are true:
print pow(p, q, p*q) + pow(q, p, p*q) == p + q # (p**q + q**p) % (p*q)
print pow(p+q, p+q, p*q) == (pow(p, p+1, p*q) + pow(q, q+1, p*q)) % (p*q) # = p**(p+q) + q**(p+q) = p**p * p**q + q**q * q**p = p**p * p + q**q * q = p**(p+1) + q**(q+1)
print pow(p, p+1, p*q) == pow(p, p, q)*p
print pow(q, q+1, p*q) == pow(q, q, p)*q
# We will provide these, so we can find p and q with simple math!
# 1) pow(p, p, q)
# 2) pow(q, q, p)
# 3) pow(p, q, p*q) + pow(q, p, p*q) and
# 4) pow(p+q, p+q, p*q)
# After finding p and q, we can find FLAG with RSA formula, coz n = p*q is RSA modulus and e = 31337
c = # get from code output
e = 31337
n = p * q
phi = (p-1)*(q-1)
d = gmpy.invert(e, phi)
FLAG = pow(c, d, n)
|
第一步
:找到最后的字符串比对位置
题目二进制拖入ida之后,可以看到最后检验的位置。
第二步
:逆出“
Base32
”的畸形表
通过字母与数字的畸形转换,逆推出编码转换表为
NoPqRsTuVwXyZaBcDeFgHiJkLm567234
第三步
:逆出
B
ase32
的编码过程
根据base64的编码过程,可以类推这里的填充与5字节到8字节编码过程
第四步
:理清楚
rot13移位变换过程
97,65 ASCII对应的分别为‘a’,‘A’,所以可以知道这个变换是字母的循环移位(rot13)。
第五步
:逆推出
flag
完整的解题脚本如下:
"""根据分析得到的码表和用于比较的字符串,base32解码,得到L@h_Xa@J_o@f332_@Aq_e0g13,之后对数据进行rot13解码,得到flag:Y@u_Kn@W_b@s332_@Nd_r0t13"""
import
base64
import
string
tr
=
string
.
maketrans
(
"NoPqRsTuVwXyZaBcDeFgHiJkLm567234"
,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
)
EnBase32
=
"weNTDk5LZsNRHk6cVogqTZmFy2NRP7X4ZHLTBZwg"
.
translate
(
tr
)
rot_13
=
base64
.
b32decode
(
EnBase32
)
print
rot_13
Flag
=
''
n
=
13
for
letter
in
rot_13
:
if
letter