代码编织梦想

前言

继续ctf的旅程
攻防世界Crypto高手进阶区的3分题
本篇是streamgame1的writeup

发现攻防世界的题目分数是动态的
就仅以做题时的分数为准了

解题过程

得到一个key文件
和一段python

from flag import flag
assert flag.startswith("flag{")
# 作用:判断字符串是否以指定字符或子字符串开头flag{
assert flag.endswith("}")
# 作用:判断字符串是否以指定字符或子字符串结尾},flag{},6个字节
assert len(flag)==25
# flag的长度为25字节,25-6=19个字节
#3<<2可以这么算,bin(3)=0b11向左移动2位变成1100,0b1100=12(十进制)
def lfsr(R,mask):
    output = (R << 1) & 0xffffff    #将R向左移动1位,bin(0xffffff)='0b111111111111111111111111'=0xffffff的二进制补码
    i=(R&mask)&0xffffff             #按位与运算符&:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
    lastbit=0
    while i!=0:
        lastbit^=(i&1)    #按位异或运算符:当两对应的二进位相异时,结果为1
        i=i>>1
    output^=lastbit
    return (output,lastbit)



R=int(flag[5:-1],2)
mask    =   0b1010011000100011100

f=open("key","ab")   #以二进制追加模式打开
for i in range(12):
    tmp=0
    for j in range(8):
        (R,out)=lfsr(R,mask)
        tmp=(tmp << 1)^out   #按位异或运算符:当两对应的二进位相异时,结果为1
    f.write(chr(tmp))  #chr() 用一个范围在 range(256)内的(就是0255)整数作参数,返回一个对应的字符。
f.close()

也就是说

  • flag是19位的二进制
  • 给了个加密函数
  • 对mask和R作用加密函数并生成新的R同时得到1bit数据,然后每8bit数据转化成一个对应的ascii再写入key文件中

key扔进winhex
在这里插入图片描述
那就爆破就完事了


def check(list1, list2):
    for i in range(12):
        if list1[i] != list2[i]:
            return False
    return True
 
 
def lfsr(R ,mask):
    output = (R << 1) & 0xffffff    #将R向左移动1位,bin(0xffffff)='0b111111111111111111111111'=0xffffff的二进制补码
    i=(R&mask)&0xffffff             #按位与运算符&:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
    lastbit=0
    while i!=0:
        lastbit^=(i&1)    #按位异或运算符:当两对应的二进位相异时,结果为1
        i=i>>1
    output^=lastbit
    return (output,lastbit)
 
 
if __name__ == '__main__':
    f = open('key','rb')
    content = f.read()
    s_list = []
    for c in content:
        s_list.append(c)
 
    print(s_list)
 
    mask = 0b1010011000100011100
 
    for i in range(1 << 19):
        print(i)
        tmp_list = []
        R = i
        for j in range(12):
            tmp = 0
            for k in range(8):
                (R, out) = lfsr(R, mask)
                tmp = (tmp << 1) ^ out  # 按位异或运算符:当两对应的二进位相异时,结果为1
            tmp_list.append(tmp)
 
        if (check(s_list, tmp_list)):
            print(bin(i))

得到flag:flag{1110101100001101011}

结语

简单爆破

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_44604541/article/details/110920752

攻防世界 Misc高手进阶区 4分题 Py-Py-Py-爱代码爱编程

前言 继续ctf的旅程 攻防世界Misc高手进阶区的4分题 本篇是Py-Py-Py的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一个pyc 反编译 # uncompyle6 version 3.5.0 # Python bytecode 3.6 (3379) # Decompiled from: Py

BUUCTF [CISCN2019 总决赛 Day2 Web1] Easyweb-爱代码爱编程

BUUCTF [CISCN2019 总决赛 Day2 Web1] Easyweb 考点: robots.txt及备份文件addslashes()函数、通过转义闭合语句用户名密码盲注文件上传php短标签启动靶机: 一个登陆页面,查看源码: <div class="clear"> </div> <div clas

BUUCTF [BUUCTF 2018] Online Tool-爱代码爱编程

BUUCTF [BUUCTF 2018] Online Tool 考点: escapeshellarg绕过(参考链接)Nmap -oG 将命令和结果写入文件启动靶机,给出了页面源码: <?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SERVER['REMOTE_A

攻防世界 Reverse高手进阶区 2分题 simple-check-100-爱代码爱编程

前言 继续ctf的旅程 攻防世界Reverse高手进阶区的2分题 本篇是simple-check-100的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 PE查壳 扔进IDA int __cdecl main(int argc, const char **argv, const char **envp) {

BUUCTF [CISCN2019 华东南赛区] Web11-爱代码爱编程

BUUCTF [CISCN2019 华东南赛区] Web11 考点: Smarty的XFF注入全部的PHP条件表达式和函数都可在{if}中使用 根据页面提示,应该是一个类似IP查询的网站,根据XFF(X-Forwarded-For)判断 使用BurpSuite抓取数据包: 添加请求头:X-Forwarded-For: 127.0.0.1,在R

BUUCTF [网鼎杯 2020 朱雀组] phpweb-爱代码爱编程

BUUCTF [网鼎杯 2020 朱雀组] phpweb 考点: \绕过in_array()黑名单(非预期)call_user_func()函数把第一个参数作为回调函数调用反序列化find命令模糊查找flag位置启动环境: 页面有Warning,发现页面存在自动刷新情况,使用BurpSuite抓取数据包: 传参中包含func与p,且页面中

攻防世界 Misc高手进阶区 4分题 Py-Py-Py-爱代码爱编程

前言 继续ctf的旅程 攻防世界Misc高手进阶区的4分题 本篇是Py-Py-Py的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一个pyc 反编译 # uncompyle6 version 3.5.0 # Python bytecode 3.6 (3379) # Decompiled from: Py

攻防世界 Crypto高手进阶区 3分题 你猜猜-爱代码爱编程

前言 继续ctf的旅程 攻防世界Crypto高手进阶区的3分题 本篇是你猜猜的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一串16进制 504B03040A0001080000626D0A49F4B5091F1E0000001200000008000000666C61672E7478746C9F170D

攻防世界 Reverse高手进阶区 2分题 parallel-comparator-200-爱代码爱编程

前言 继续ctf的旅程 攻防世界Reverse高手进阶区的2分题 本篇是parallel-comparator-200的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一段c #include <stdlib.h> #include <stdio.h> #include <pt

攻防世界 Reverse高手进阶区 2分题 simple-check-100-爱代码爱编程

前言 继续ctf的旅程 攻防世界Reverse高手进阶区的2分题 本篇是simple-check-100的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 PE查壳 扔进IDA int __cdecl main(int argc, const char **argv, const char **envp) {

攻防世界 Reverse高手进阶区 2分题 Newbie_calculations-爱代码爱编程

前言 继续ctf的旅程 攻防世界Reverse高手进阶区的2分题 本篇是Newbie_calculations的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 PE查壳 扔进IDA int __cdecl main(int argc, const char **argv, const char **envp

攻防世界 Reverse高手进阶区 2分题 re1-100-爱代码爱编程

前言 继续ctf的旅程 攻防世界Reverse高手进阶区的2分题 本篇是re1-100的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 PE查壳 扔进IDA int __cdecl __noreturn main(int argc, const char **argv, const char **envp)