草庐IT

攻防世界-CRYPTO-新手练习区WP

T2cer 2023-04-07 原文

攻防世界-CRYPTO做题记录

base64

题目
直接用base64工具.

Caesar

题目
方法一:直接上工具,根据flag格式简单算一下位移多少位时第一位会出现c字母,最后得出位移数位12
方法二:暴力解密

#include <stdio.h>
#include <stdlib.h>
/* 穷举法解密 */
int main()
{
    char word_1[1000] = "\0"; //解密前
    char word_2[1000] = "\0"; //解密后
    int i = 0;
    int j = 0;
    printf("输入密文:");
    scanf("%s", word_1);
    for(i = 0; i < 26; i++)
    {
        for(j = 0; word_1[j] != '\0'; j++)
        {
            if(word_1[j] >= 'A' && word_1[j] <= 'Z')
                word_2[j] = (word_1[j] - 'A' + i) % 26 + 'A';   //将密钥key换成i进行尝试
            else if(word_1[j] >= 'a' && word_1[j] <= 'z')
                word_2[j] = (word_1[j] - 'a' + i) % 26 + 'a';
        }
        printf("第%d次尝试:%s\n", i + 1, word_2);
    }
    return 0;
}

ps:使用前删掉密文中的符号

Morse

题目
打开题时一串0和1
1为-,0为.,空格直接空得到标准的摩斯密码然后直接用工具解
题目要求为小写再转换一下就可以了

幂数加密

题目
幂数加密介绍

以0为界限隔断数字,每项数字相加得到的结果即为字母表中对应的字母顺序

或者写个脚本解

# /usr/bin/env python
# coding=utf-8
a = "8842101220480224404014224202480122"
a = a.split("0")
flag = ''
for i in range(0, len(a)):
    str = a[i]
    list = []
    sum = 0
    for j in str:
        list.append(j)
        length = len(list)
    for k in range(0, length):
        sum += int(list[k])
    flag += chr(sum + 64)
print(flag)

Railfence

题目
试了挺久普通的栅栏解码都没解才想到可能是用了W型栅栏加密
工具
或者用脚本解

'''
若知道栏数,则使用decode解密,若不知道,则使用crack_cipher遍历所有可能性
'''

def generate_w(string, n):
    '''将字符排列成w型'''
    array = [['.'] * len(string) for i in range(n)]  # 生成初始矩阵
    row = 0
    upflag = False
    for col in range(len(string)):  # 在矩阵上按w型画出string
        array[row][col] = string[col]
        if row == n - 1:
            upflag = True
        if row == 0:
            upflag = False
        if upflag:
            row -= 1
        else:
            row += 1
    return array


def encode(string, n):
    '''加密'''
    array = generate_w(string, n)
    msg = []
    for row in range(n):  # 将每行的字符连起来
        for col in range(len(string)):
            if array[row][col] != '.':
                msg.append(array[row][col])
    return array, msg


def decode(string, n):
    '''解密'''
    array = generate_w(string, n)
    sub = 0
    for row in range(n):  # 将w型字符按行的顺序依次替换为string
        for col in range(len(string)):
            if array[row][col] != '.':
                array[row][col] = string[sub]
                sub += 1
    msg = []
    for col in range(len(string)):  # 以列的顺序依次连接各字符
        for row in range(n):
            if array[row][col] != '.':
                msg.append(array[row][col])
    return array, msg


def crack_cipher(string):
    '''破解密码'''
    for n in range(2, len(string)):  # 遍历所有可能的栏数
        print(str(n) + '栏:' + ''.join(decode(string, n)[1]))


if __name__ == "__main__":
    string = "ccehgyaefnpeoobe{lcirg}epriec_ora_g"
    n = 5  # 栏数

    # 若不知道栏数,则遍历所有可能
    # crack_cipher(string)

    # 若知道栏数
    array, msg = decode(string, n)
    # array,msg = encode(string, n)
    for i in array: print(i)
    print(''.join(msg))

不仅仅是Morse

题目
看见题目首先进行摩斯解密,出来一堆A,B,然后我们就可以想到这大概率是培根加密了

培根解密

混合编码

题目
首先看到base64明显的标志我们先base64一下

出来的东西也很明显是unicode

然后再进行base64

最后可以对照ascii表手工写也可以写个脚本跑
脚本如下:
第一种:

#include <bits/stdc++.h>
using namespace std;

signed main()
{
    vector<int> a{119, 101, 108, 99, 111, 109, 101, 116, 111, 97, 116, 116, 97, 99, 107, 97, 110, 100, 100, 101, 102, 101, 110, 99, 101, 119, 111, 114, 108, 10};
    for(int i=0;i<a.size();i++)cout<<(char)a[i]<<" ";
    return 0;
}

第二种:

//自动去除'\'
#include <bits/stdc++.h>

using namespace std;

signed main()
{
    char c;
    while ((c = getchar()) != EOF)
    {
        if (c == '\\')
            cout << " ";
        else
            cout << c;
    }
    return 0;
}
}

easy_RSA

题目
这题蛮简单的写脚本直接求就行
题目信息有p,q,e,那就可以直接求phi_n,然后求d

import gmpy2
from Crypto.Util.number import long_to_bytes

e = 17
p = 473398607161
q = 4511491
phi_n = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi_n)
print(d)

easychallenge

题目
首先我们拿到pyc文件,第一件事情就是反编译它,当然有的pyc文件会加密操作,让我们无法成功反编译,但是这个还是可以的直接反编译,在线网站和python都可以,这里使用的是在线网站

网站链接

紧接着,我们拿到逆向出来的源代码

#!/usr/bin/env python
# visit http://tool.lu/pyc/ for more information
import base64


def encode1(ans):
    s = ''
    for i in ans:
        x = ord(i) ^ 36
        x = x + 25
        s += chr(x)

    return s


def encode2(ans):
    s = ''
    for i in ans:
        x = ord(i) + 36
        x = x ^ 36
        s += chr(x)

    return s


def encode3(ans):
    return base64.b32encode(ans)


flag = ' '
print
'Please Input your flag:'
flag = raw_input()
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
if encode3(encode2(encode1(flag))) == final:
    print
    'correct'
else:
    print
    'wrong'

这个代码主函数部分很好理解

就是输入一个flag然后我们进行三层加密后,我们查看是否和我们最后的final一致,如果是一致的话,那么我们就是得到了正确的一个flag

那么我们的思路就是逆向推导,首先我们的最后一次加密encode3,我们可以直接base64.b32decode()这个返回的类型是int类型,用python测的话是byte

然后我们第一层解码成功

def decode3(ans):
    return base64.b32decode(ans)

然后我们进行第二层的一个解密操作,观察代码

def encode2(ans):
    s = ''
    for i in ans:
        x = ord(i) + 36
        x = x ^ 36
        s += chr(x)

    return s

那么我们可以把每一位分离出来,然后我们再异或上一个36,异或的逆运算还是其本身,然后再减去一个36,最后chr()一下加到s中

代码如下:

def decode2(ans):
    s = ''
    for i in ans:
        x = i ^ 36
        x = x - 36
        s += chr(x)
    return s

这里有一点需要注意的就是,我们的返回类型上次是int了这里不需要ord了

然后最后一层代码也是同理,唯一的一个区别就是它这次返回类型是string,所以我们需要ord一下再进行操作

代码如下:

def decode1(ans):
    s = ''
    for i in ans:
        x = ord(i)
        x -= 25
        x = x ^ 36
        s += chr(x)

    return s

最后,我们的就成功的解密了我们的这个文件了,最后总代码如下:

import base64
import chardet


def decode1(ans):
    s = ''
    for i in ans:
        x = ord(i)
        x -= 25
        x = x ^ 36
        s += chr(x)

    return s


def decode2(ans):
    s = ''
    for i in ans:
        x = i ^ 36
        x = x - 36
        s += chr(x)
    return s


def decode3(ans):
    return base64.b32decode(ans)


flag = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='

flag = decode3(flag)

# response = chardet.detect(flag)
# print(flag.decode('ISO-8859-1'))

flag = decode2(flag)
flag = decode1(flag)

print(flag)

Normal_RSA

题目

提供文件

flag.enc 后缀enc,分析是一个通过openssl加密后生成的文件

pubkey.pem 打开时一个公钥加密文件

使用openssl提取pubkey.pem文件信息

命令如下:
1.进入openssl

openssl

2.提取信息

rsa -pubin -text -modulus -in warmup -in pubkey.pem


3.得到信息
Exponent即为e
Modulus即为n

分解素数

可以看到modulus是个十六进制数,我们得先转换成十进制
转换得到:

87924348264132406875276140514499937145050893665602592992418171647042491658461

分解得到:

现在已知信息:
p=275127860351348928173285174381581152299
q=319576316814478949870590164193048041239
e=65537

生成private.pem文件

安装工具rsatools
命令如下:

apt-get install libgmp-dev
apt-get install libmpfr-dev
apt-get install libmpc-dev
apt-get install python3-pip
pip install gmpy2
git clone https://github.com/Ganapati/RsaCtfTool.git
cd RsaCtfTool
pip install -r requirements.txt

安装成功了之后把公钥(pubkey.pem)放到这个文件夹里面,然后我们在终端执行下边的命令

python3 RsaCtfTool.py --publickey pubkey.pem --private

这里就生成了私钥,然后创建一个叫private.pem的文件把私钥放里边和pubke.pem等文件放在同一个文件夹里
这里手动创建私钥文件的原因是下面这个命令执行后kail依旧无法自动生成private.pem文件,所以最后换成了上边的命令后能得到私钥的内容但是需要自己手动创建

python rsatool.py -f PEM -o private.pem -p 275127860351348928173285174381581152299 -q 319576316814478949870590164193048041239 -e 65537

然后在这个文件夹里面打开终端

执行如下命令:

openssl
rsautl -decrypt -in flag.enc -inkey private.pem -out flag.txt

最后flag就出来了

转轮机加密

题目
之前没遇到过,所以得先了解一下原理

换位后的密文为:

NACZDTRXMJQOYHGVSFUWIKPBEL
FHTEQGYXPLOCKBDMAIZVRNSJUW
QGWTHSPYBXIZULVKMRAFDCEONJ
KCPMNZQWXYIHFRLABEUOTSGJVD
SXCDERFVBGTYHNUMKILOPJZQAW
EIURYTASBKJDFHGLVNCMXZPQOW
VUBMCQWAOIKZGJXPLTDSRFHENY
OSFEZWAXJGDLUBVIQHKYPNTCRM
QNOZUTWDCVRJLXKISEFAPMYGHB
OWTGVRSCZQKELMXYIHPUDNAJFB
FCUKTEBSXQYIZMJWAORPLNDVHG
NBVCXZQWERTPOIUYALSKDJFHGM
PNYCJBFZDRUSLOQXVETAMKGHIW

接下来写脚本将每一列提出来并转成小写字母

#include <bits/stdc++.h>

using namespace std;

signed main()
{
//    cout<<(int)'a'<<endl;
//    cout<<(int)'A'<<endl;
    freopen("out.txt","w",stdout);
    char s[1010][1010]=
    {
        "NACZDTRXMJQOYHGVSFUWIKPBEL",
        "FHTEQGYXPLOCKBDMAIZVRNSJUW",
        "QGWTHSPYBXIZULVKMRAFDCEONJ",
        "KCPMNZQWXYIHFRLABEUOTSGJVD",
        "SXCDERFVBGTYHNUMKILOPJZQAW",
        "EIURYTASBKJDFHGLVNCMXZPQOW",
        "VUBMCQWAOIKZGJXPLTDSRFHENY",
        "OSFEZWAXJGDLUBVIQHKYPNTCRM",
        "QNOZUTWDCVRJLXKISEFAPMYGHB",
        "OWTGVRSCZQKELMXYIHPUDNAJFB",
        "FCUKTEBSXQYIZMJWAORPLNDVHG",
        "NBVCXZQWERTPOIUYALSKDJFHGM",
        "PNYCJBFZDRUSLOQXVETAMKGHIW",
    };

    for(int i=0;i<26;i++)
    {
        for(int j=0;j<13;j++)
        {
            cout<<(char)(s[j][i]+32);
        }
        puts("");
    }
    return 0;
}

得到的结果是:
nfqksevoqofnp
ahgcxiusnwcbn
ctwpcubfotuvy
zetmdrmezgkcc
dqhneyczuvtxj
tgszrtqwtrezb
rypqfawawsbqf
xxywvsaxdcswz
mpbxbbojczxed
jlxygkigvqqrr
qoiitjkdrkytu
oczhydzljeips
ykufhfgullzol
hblrnhjbxmmio
gdvlugxvkxjuq
vmkamlpiiywyx
sambkvlqsiaav
fireinthehole
uzaulcdkfprst
wvfoomsyaupka
irdtpxrppdldm
kncsjzfnmnnjk
psegzphtyadfg
bjojqqecgjvhh
eunvaonrhfhgi
lwjdwwymbbgmw

从中挑出通顺的句子交flag

ps:最后交flag的时候没有格式!直接交就行,不要写flag{}也不要写cyberpeace{}

easy_ECC

题目
使用工具Ecctool

x+y=13957031351290+5520194834100=19477226185390
得到flag

完结撒花!

有关攻防世界-CRYPTO-新手练习区WP的更多相关文章

  1. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  2. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  3. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  4. ruby-on-rails - ruby 新手,有人可以帮我从控制台破译这个错误吗? - 2

    我真的只是不确定这意味着什么或我应该做什么才能让网页在我的本地主机上运行。现在它只是显示一个错误,上面写着“我们很抱歉,但出了点问题。”当我运行railsserver并在chrome中打开localhost:3000时。这是控制台输出:StartedGET"/users/sign_in"for127.0.0.1at2013-07-0512:07:07-0400ProcessingbyDevise::SessionsController#newasHTMLCompleted500InternalServerErrorin55msNoMethodError(undefinedmethod`

  5. ruby-on-rails - Rails 新手 : Recommendations for error handling in controller - 2

    抱歉,如果问题很明显,我才刚刚开始使用Rails。我现在在几个Controller方法中有以下代码:respond_todo|format|if@project.saveformat.html{redirect_to(edit_project_url(@project),:notice=>'#{user.name}addedto#{role}.')}format.jselseformat.html{render:action=>"edit"}format.js#...endend那么问题来了,对于所有方法中的错误,最好的方法是什么?是否建议我使用save!并在rescue_action

  6. ruby-on-rails - (Rails 新手)rails 服务器错误 : cannot load such file -- bootsnap/setup (LoadError) - 2

    我已经将我的JS运行时安装为Node,并且我已经更新了bundle并安装了bundle,但我仍然收到此错误:/Users/macbook/Documents/Studies/Coding/the_back_end/the_odin_project/odin_on_rails/hello_app/config/boot.rb:4:in`require':cannotloadsuchfile--bootsnap/setup(LoadError)from/Users/macbook/Documents/Studies/Coding/the_back_end/the_odin_project/

  7. Unity3D : 本地坐标系,世界坐标系,和TransformPoint,TransformVector,TransformDirection的区别 - 2

    目录一、世界坐标系与本地坐标系二、srcGameObject.transform.TransformPoint(Vector3 vec)三、srcGameObject.transform.TransformVector(Vector3 vec)四、srcGameObject.transform.TransformDirection(Vector3 vec)五:示例一、世界坐标系与本地坐标系    世界坐标很好理解,就是模型的transform.position,通常在无父物体的情况下,创建出来的模型默认位置就是世界坐标系的原点。    每个物体都有自身的坐标系,此坐标系就是本地坐标系。本地坐标

  8. ruby - 在 ruby​​ 中如何使用类级局部变量? ( ruby 新手的问题) - 2

    所以假设我有这个(不工作):classUserdescription="IamUserclassvariable"defprintputsdescriptionendend那么,我应该如何使用var描述,如何将它作为默认参数传递到方法中,或者直接在方法中使用?谢谢.. 最佳答案 在您的情况下,description只是局部变量。您可以使用特殊字符@、@@、$更改此范围:a=5defined?a=>"local-variable"@a=5defined?@a=>"instance-variable"@@a=5defined?@@a=>

  9. ruby 新手 : undefined method `with_indifferent_access' - 2

    我是一名新的Ruby程序员,我的一位同事帮助我开始编写了以下代码,该代码在他的环境中运行良好。但是,当我尝试在自己的环境中运行它时,出现以下错误:undefinedmethod'with_indifferent_access'for#(没有方法错误)有问题的方法在代码中出现了两次:require'rubygems'gem'activerecord'gem'activesupport'gem'sailthru-client'require'active_support'require'active_record'require'sailthru'#SetupourSailthruobje

  10. jquery - 世界上最愚蠢的人(我)的 Rails 教程? - 2

    我很难找到符合我要求的Rails教程(或书籍也很棒):愚蠢Ruby1.9或最新的1.8MySQL一个游戏(简单的掷骰子游戏)JQuery前端谢谢! 最佳答案 RailsforDummies如果愚蠢是一个主要问题,这可能是您最好的选择。 关于jquery-世界上最愚蠢的人(我)的Rails教程?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3841475/

随机推荐