小菜鸡只写了三个题,现在只是复现一下,记录下学习到的知识
whereThel1b
爆破
文件里面包含一个python文件一个so文件
查了下,这个so文件可能是cython编写的,很复杂,我不会看
import whereThel1b
flag = input("where is my flag:")
flag = flag.encode()
encry = [108, 117, 72, 80, 64, 49, 99, 19, 69, 115, 94, 93, 94, 115, 71, 95, 84, 89, 56, 101, 70, 2, 84, 75, 127, 68, 103, 85, 105, 113, 80, 103, 95, 67, 81, 7, 113, 70, 47, 73, 92, 124, 93, 120, 104, 108, 106, 17, 80, 102, 101, 75, 93, 68, 121, 26]
whereThel1b.whereistheflag(flag)
ret = whereThel1b.trytry(flag)
if ret == encry:
print("rrrrrrrrrrrright")
else:
print("wwwwwwwwwwwwwwwrong")
kali上运行了一堆,没看到任何有用的消息
尝试在kali上运行这个python,告诉我版本不同
window上不行哦,因为so文件是只能linux上运行
成功运行了
首先第一个想法肯定是破解这个so文件,但是我尝试了下,不会~
但是IDA里面告诉我一个重要的消息,长度和有base64的存在
然后我就尝试,跳过加密过程,因为我看不懂,然后尝试对应密文,我首先是试着让得到的数据数量一样,然后到了这个数量的flag就ok了
42个字符,这个42个是怎么来的呢——42/3*4 ,base64!
所以最后的encry是flagbase64后的数据进行某种操作得到的
然后我就尝试能不能爆破出来————
原理是,因为我们是三个明文确定4个密文,那么我们就三个三个的爆破
代码如下:
# 初始化flag模板
flag_template = '12345aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}'
flag_bytes = flag_template.encode()
# 给定的加密向量
encryption_vector = [
108, 117, 72, 80, 64, 49, 99, 19, 69, 115, 94, 93, 94, 115, 71, 95,
84, 89, 56, 101, 70, 2, 84, 75, 127, 68, 103, 85, 105, 113, 80, 103,
95, 67, 81, 7, 113, 70, 47, 73, 92, 124, 93, 120, 104, 108, 106, 17,
80, 102, 101, 75, 93, 68, 121, 26
]
# 初始化匹配起始位置和步长
start_pos = 0
step = 3
match_start = 0
# 解码循环
for i in range(start_pos, 41, step):
temp_flag = flag_bytes # 保存当前flag副本用于尝试修改
found_match = False # 添加标志位判断本轮是否找到匹配
for x in string.printable:
for y in string.printable:
for z in string.printable:
temp_flag = temp_flag[:i] + bytes([ord(x), ord(y), ord(z)]) + temp_flag[i + 3:]
# 尝试解码并检查匹配情况
temp_result = fun1(temp_flag.decode())
match = all(encryption_vector[j] == (temp_result[j]) for j in range(match_start, match_start + 4))
if match:
flag_bytes = temp_flag # 更新flag字节
found_match = True # 设置找到匹配标志
break # 匹配成功,跳出yz循环
if found_match:
break # 如果匹配成功,也跳出x循环
if found_match:
break # 直接进行下一轮,无需执行else部分
print(flag_bytes.decode())
match_start += 4 # 更新匹配起始索引
# 输出最终解码的flag
print(flag_bytes.decode())
中间因为运行一个fun1就有一个where is flag 出现,我让AI把他删除了
eazy!
猜测——逆向
这个方法比较马后炮,我也是看着别人wp猜的
还是回到这一步,虽然 我比赛没有逆出来,但是赛完后看了下哥老关的wp,
抛开我们不认识的函数不说,认识的函数就是 base64——randint——random 加密是什么呢?
只能猜经典xor了
import base64 encry = [108, 117, 72, 80, 64, 49, 99, 19, 69, 115, 94, 93, 94, 115, 71, 95, 84, 89, 56, 101, 70, 2, 84, 75, 127, 68, 103, 85, 105, 113, 80, 103, 95, 67, 81, 7, 113, 70, 47, 73, 92, 124, 93, 120, 104, 108, 106, 17, 80, 102, 101, 75, 93, 68, 121, 26] flag='flg' flag=flag.encode() print(base64.b64encode(bytes(flag)))
通过这一段代码,我们可以得到
base64后
90 109 120 110
这四组数据成为了
108, 117, 72, 80,
。。
来个截图你们自己看看,我也不知道怎么找到这个加密的
公布这段费解的过程,求大佬知道给我讲讲