攻防世界crypto新手区wp

base64(base密码)

先了解一下base64吧:
base64这种方式编码后得到的是一个字符串,其中的字符可以包括a-z、A-Z、0-9、+、 共64个字符。如果出现这些字符的话就可以考虑一下base64了。
一般后面有=(填充字符)就可以判定为base64啦!

Y3liZXJwZWFjZXtXZWxjb21lX3RvX25ld19Xb3JsZCF9
这串字符包括a-z、A-Z、0-9:很像,在线base64解一下吧。
也可根据题目名字,我们直接在线base64解密就好啦。
在线工具:http://ctf.ssleye.com/

分享一个超好用的工具:
CaptfEncoder是一款跨平台的网络安全相关编码转换、古典密码、密码学、特殊编码等工具,并聚合各类在线工具。
百度网盘哦!
链接:https://pan.baidu.com/s/1Ap27KnDCGBlrHegytQZiGA
提取码:mxnb
Flag:cyberpeace{Welcome_to_new_World!}

caesar(凯撒密码)

先了解一下caesar吧:
凯撒密码属于代换密码,它将明文中的各个字符按顺序进行 n 个字符错位转换的加密方法我们称为凯撒密码。 优点:实现了最简单的加密方案,容易理解。缺点:对于有一点点密码学功底的朋友来说,安全强度几乎为零。

本题的密文:
oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}
非常明显,我们只要把每个字母移动一定为位数就可以得到flag{XXXX}啦!
当然直接看题目名字,事半功倍哦!‘

我们直接在线工具或者我分享的那个工具解一下就好啦。
不过还需要输入一个密钥key(0-25)也叫位移量。
一个一个试就好啦。从0-试到25。当然也可用工具直接全部列出来
不过提倡手动哦。

对了,分享一个python脚本吧

#coding:utf-8 #caesar(凯撒密码) import string  s = '这里输入密文哦'  def decrypt(strs):     for i in range(26):         dec_str = ''         for j in strs:             if j in string.ascii_letters:                 if j.isupper():                     dec_str = dec_str + chr( (ord(j)-ord('A')-i) %26 + ord('A'))                 if j.islower():                     dec_str = dec_str + chr( (ord(j)-ord('a')-i) %26 + ord('a'))             else:                 dec_str += j         print(str(i) + ':' + dec_str + 'n')  if __name__ == '__main__':     decrypt(s) 

不过最好还是在线解密然后测试key0-25。
Flag:cyberpeace{you_have_learned_caesar_encryption}

morse(摩尔斯密码)

何为morse呢?看起来很高级,其实也就那样,嘿嘿。
直接给出一直密码对应表吧!
攻防世界crypto新手区wp
这里可以用".“替换"0”/“1”/“A”/“B”, 用"-“替换"1”/“0”/“B"/“A"等等
没事,直接用工具,管他是XX替换XX直接解它!
(点击左上角的三杠可以切换其他编码)
攻防世界crypto新手区wp
链接:https://pan.baidu.com/s/1Ap27KnDCGBlrHegytQZiGA
提取码:mxnb

本题wp:
11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110
摩斯密码使用 . - 来表示不同含义,这里只用 0和1,所以应该是用01代替. -。 那么到底是用1代表.还是用0代表.呢? 都试一下不就好了
首先,转换为标准莫斯密码格式,即‘1’转换为‘-’,‘0’转换为‘.’
Morse解码:
morsecodeissointeresting
提示:flag格式为cyberpeace{xxxxxxxxxx},均为小写
根据提示构造flag
Flag:cyberpeace{morsecodeissointeresting}
可以手工转换哦,就是有点费时间。

用python脚本转换吧

key = '11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110' result = '' for i in key:  if i == '1':  result += '-'  elif i == '0':  result += '.'  else:  result += ' ' print(result.lower()) 

Flag:cyberpeace{morsecodeissointeresting}

幂数加密(云影密码)

题目:8842101220480224404014224202480122
完了,这是啥???
赶紧百度一下幂数加密
发现这是叫云影密码
攻防世界crypto新手区wp提示:flag为cyberpeace{你解答出的八位大写字母}
因为提示是八位大写字母,又发现有7个0,所以我们可以猜想分成8段

手工解密:
攻防世界crypto新手区wp
python脚本:
攻防世界crypto新手区wp

a = "8842101220480224404014224202480122" a = a.split("0") flag: str = '' for i in range(0, len(a)):     str = a[i]     sum = 0     for i in str:         sum += int(i)     flag += chr(sum + 64) print (flag) 

或者:

a=["88421","0122","048","02244","04","0142242","0248","0122"]  flag=""  for j in range(0,len(a)):      str = a[j]      list=[]      sum=0      for i in str:          list.append(i)          length = len(list)      for i in range(0,length):          sum+=int(list[i])      flag+=chr(64+sum)  print (flag) 

Flag:cyberpeace{WELLDONE}

不仅仅是Morse(莫斯密码+培根密码)

题目:
–/.-/-.–/…–.-/-…/./…–.-/…/.-/…-/./…–.-/.-/-./—/-/…/./.-./…–.-/-…/./-.-./—/-…/./…/…/…/…/.-/.-/.-/.-/.-/-…/.-/.-/-…/-…/-…/.-/.-/-…/-…/.-/.-/.-/.-/.-/.-/.-/.-/-…/.-/.-/-…/.-/-…/.-/.-/.-/.-/.-/.-/.-/-…/-…/.-/-…/.-/.-/.-/-…/-…/.-/.-/.-/-…/-…/.-/.-/-…/.-/.-/.-/.-/-…/.-/-…/.-/.-/-…/.-/.-/.-/-…/-…/.-/-…/.-/.-/.-/-…/.-/.-/.-/-…/.-/.-/-…/.-/-…/-…/.-/.-/-…/-…/-…/.-/-…/.-/.-/.-/-…/.-/-…/.-/-…/-…/.-/.-/.-/-…/-…/.-/-…/.-/.-/.-/-…/.-/.-/-…/.-/.-/-…/.-/.-/.-/.-/-…/-…/.-/-…/-…/.-/.-/-…/-…/.-/.-/-…/.-/.-/-…/.-/.-/.-/-…/.-/.-/-…/.-/.-/-…/.-/.-/-…/.-/-…/.-/.-/-…/-…/.-/-…/.-/.-/.-/.-/-…/-…/.-/-…/.-/.-/-…/-…/.-
明显莫斯密码啦,解密一下!
再给出一个在线网址吧:
http://www.zhongguosou.com/zonghe/moErSiCodeConverter.aspx
这个网站对摩斯代码的分隔方式支持单斜杠和空格
不过工具也可以哦,方便
攻防世界crypto新手区wpMAYBEHAVEANOTHERDECODEHHHHAAAAABAABBBAABBAAAAAAAABAABABAAAAAAABBABAAABBAAABBAABAAAABABAABAAABBABAAABAAABAABABBAABBBABAAABABABBAAABBABAAABAABAABAAAABBABBAABBAABAABAAABAABAABAABABAABBABAAAABBABAABBA
解密后出现这一大堆,裂开。

赶紧看一波本题提示:
Maybe have another decode … 它的意思应该不是让你从头开始换另一个,而是对摩斯密码解析出来的再用一个的方式解密。
很有特征的是,它只有两个字符组成,这是培根密码的典型特征。(手抓饼,A套餐,B套餐

认识一下培根密码(bacon)
又名倍康尼密码(英语:Bacon’s cipher)是由法兰西斯·培根发明的一种隐写术。
培根密码实际上就是一种替换密码,根据所给表一一对应转换即可加密解密 。它的特殊之处在于:可以通过不明显的特征来隐藏密码信息,比如大小写、正斜体等,只要两个不同的属性,密码即可隐藏。
先给个解密脚本吧:

# coding:utf8  import re  alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']  first_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","babaa","babab","babba","babbb","bbaaa","bbaab"]  second_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","baabb","babaa","babab","babba","babbb"]  def encode():     upper_flag = False # 用于判断输入是否为大写     string = raw_input("please input string to encode:n")     if string.isupper():         upper_flag = True         string = string.lower()     e_string1 = ""     e_string2 = ""     for index in string:         for i in range(0,26):             if index == alphabet[i]:                 e_string1 += first_cipher[i]                 e_string2 += second_cipher[i]                 break     if upper_flag:         e_string1 = e_string1.upper()         e_string2 = e_string2.upper()     print "first encode method result is:n"+e_string1     print "second encode method result is:n"+e_string2     return   def decode():     upper_flag = False  # 用于判断输入是否为大写     e_string = raw_input("please input string to decode:n")     if e_string.isupper():         upper_flag = True         e_string = e_string.lower()     e_array = re.findall(".{5}",e_string)     d_string1 = ""     d_string2 = ""     for index in e_array:         for i in range(0,26):             if index == first_cipher[i]:                 d_string1 += alphabet[i]             if index == second_cipher[i]:                 d_string2 += alphabet[i]     if upper_flag:         d_string1 = d_string1.upper()         d_string2 = d_string2.upper()     print "first decode method result is:n"+d_string1     print "second decode method result is:n"+d_string2     return   if __name__ == '__main__':     print "ttcoding by qux"     while True:         print "t*******Bacon Encode_Decode System*******"         print "input should be only lowercase or uppercase,cipher just include a,b(or A,B)"         print "1.encoden2.decoden3.exit"         s_number = raw_input("please input number to choosen")         if s_number == "1":             encode()             raw_input()         elif s_number == "2":             decode()             raw_input()         elif s_number == "3":             break         else:             continue 

攻防世界crypto新手区wp
我们可以看到密码对照表只有a、b以及大写
所以我们删去MAYBEHAVEANOTHERDECODEHHHH
然后在线解密工具、我分享的那个工具captfencoder、脚本都可以解
只保留A/B然后培根解密:
att攻防世界crypto新手区wp
在线工具吧:
http://ctf.ssleye.com/jinzhi.html
或者:captfencoder
Ascll解码(十进制转abc)
/w/e/l/c/o/m/e/t/o/a/t/t/a/c/k/a/n/d/d/e/f/e/n/c/e/w/o/r/l/d

注意!!!!!有时候可能解不出来,尝试一下其他在线工具试试,多去尝试!

cyberpeace{小写的你解出的答案}(要去掉/)
Flag:cyberpeace{welcometoattackanddefenceworld}

easy_RSA(RSA算法 rsa-tool工具解)

RSA算法,很复杂!!!菜鸡我搞不懂
本题是很非常十分简单的了
直接上工具:rsatool2v17
链接:https://pan.baidu.com/s/1idmYZOv6u4JUsM00P4wQfw
提取码:mxnb

提示:
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d
直接用工具!
攻防世界crypto新手区wp
e的值注意是十六进制表示 即十进制17 它对应的十六进制为 11
数据来源是采用 10 进制(Number Base)包括 P、Q、R、D
而 E 则采用 16 进制
题目:p=473398607161,q=4511491,e=17
public exponent(E)[HEX]=11

输入 1.P=473398607161 2.q=4511491 3.e=17=11(hex)16进制
Number base要改为10
然后直接Calc.D 即可
flag格式为cyberpeace{小写的你解出的答案}
Flag:cyberpeace{125631357777427553}

Easychallenge(pyc反编译解码)

本题目的:掌握pyc反编译的方法以及阅读python代码的能力
本题是一个很简单的异或加密
反编译可以使用uncompyle6或者在线反编译pyc

在线反编译:https://tool.lu/pyc/

或者安装uncompyle6,pip install uncompyle6
反编译命令 uncompyle6 xxxxx.pyc,得到
UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===

也可以python脚本:

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
python脚本:

import base64 s="UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===" s=base64.b32decode(s) m = '' for i in s:    x = ord(i) ^ 36    x = x - 36    m+= chr(x) h = '' for i in m:    x = ord(i) - 25    x = x ^ 36    h+= chr(x) print h 

攻防世界crypto新手区wp
Flag:cyberpeace{interestinghhhhh}

Broadcast

提示:粗心的Alice在制作密码的时候,把明文留下来,聪明的你能快速找出来吗?

工具:notepad++(其他编码工具也可)
链接:https://pan.baidu.com/s/10MKRkPpMPnIXxsywRkHYGw
提取码:mxnb

直接解压得到task.py打开(notepad++)获取flag
Flag:flag{fa0f8335-ae80-448e-a329-6fb69048aae4}

转轮机加密

提示:托马斯·杰斐逊。 flag,是字符串,小写。
1: < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: < KPBELNACZDTRXMJQOYHGVSFUWI <
3: < BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: < RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: < IHFRLABEUOTSGJVDKCPMNZQWXY <
6: < AMKGHIWPNYCJBFZDRUSLOQXVET <
7: < GWTHSPYBXIZULVKMRAFDCEONJQ <
8: < NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: < XPLTDSRFHENYVUBMCQWAOIKZGJ <
10: < UDNAJFBOWTGVRSCZQKELMXYIHP <
11: < MNBVCXZQWERTPOIUYALSKDJFHG <
12: < LVNCMXZPQOWEIURYTASBKJDFHG <
13: < JZQAWSXCDERFVBGTYHNUMKILOP <

密钥为:2,3,7,5,13,12,9,1,8,10,4,11,6
密文为:NFQKSEVOQOFNP

转轮机工作原理:转轮密码机由多个转轮构成,每个转轮旋转的速度都不一样,比如有3个转轮,分别标号为1,2,3,其中1号转轮转动26个字母后,2号转轮就转动一个字母,当2号转轮转动26个字母后,3号转轮就转动1个字母。因此,当转轮密码机转动26X26X26次后,所有转轮恢复到初始状态,即3个转轮密码机的一个周期长度为26X26X26(17576)的多表代换密码。
(好复杂害哎唉)

掌握转轮机密码编码以及解码方式
参看:传统密码学(三)——转轮密码机 是个多表替换密码。 基本操作是“旋转”,其余的和本题是没有关系。
加密表和密钥、密文的特点
加密表每一行都有 26 个不同的字母,密钥的长度、密文长度、表格的行数都是 13,密文中字母是有重复字母的。
猜想一:
由此推断,密文是滚轮机的加密表某一列的字母连起来。 然而经过尝试并非如此,每一行对应密文中的字母对应的序号与下一行的字母对应的序号之间的差值不能根据密钥推出! 调整调整!!!是否有其他解法?
猜想二:
跳出之前的思维,之前的思考角度是试图逆向想出它的加密方案, 但是如果同时有密文和密钥,其实只要知道解密方案就好了, 虽然加密和解密是逆向的过程,但是方法不同。所以可以双向思考、双向破解:
根据密文密钥的特点,猜测加密方法,对密码进行攻击。
根据密文密钥,推测解密方法,使用解密方法对密文进行解密。
既然猜想一似乎没有出路了,接下来尝试 2 对应的思路。 构造解密和加密的攻防世界crypto新手区wp
手榴弹扔得比较近的时候需要喊fire in the hole
攻防世界crypto新手区wp
法二:
攻防世界crypto新手区wp

攻防世界crypto新手区wp
攻防世界crypto新手区wp
flag:fireinthehole

Normal_RSA

天!!!又是rsa???还是normal!!!
rsatool2v17工具好像不管用了
我用这个解不出来,可能可以解只不过我比较菜!

我使用kali上的RSA-toll工具
这个工具kali没自带,裂开,安装好麻烦的!

使用python --version terminal命令检查是否已安装Python
(一般都有)

1.安装mpfr
先输入命令:
wget https://www.mpfr.org/mpfr-current/mpfr-4.1.0.tar.bz2
再输入命令:
tar -jxvf mpfr-4.1.0.tar.bz2 && cd mpfr-4.1.0
再次输入命令:
./configure
最后输入:
sudo make && sudo make install
这仅仅是第一步…害

2.然后安装mpc
先输入命令:
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz
再输入命令:
tar -zxvf mpc-1.2.1.tar.gz && cd mpc-1.2.1
再次输入命令:
./configure
最后输入:
sudo make && sudo make install

3.安装RsaCtfTool
先输入命令:
git clone https://github.com/Ganapati/RsaCtfTool.git
再输入命令:
命令更新 apt-get update && apt-get upgrade
再次输入命令:
安装pip命令(python3版本所对应的是pip3) sudo apt-get install python3-pip
最后输入:
pip3 -V命令查看是否安装成功 pip3 -v

4.配置库
输入命令:
pip3 install -r requirements.txt
安装好之后就可以使用了
python3 RsaCtfTool.py

也可以使用这款工具:
https://github.com/3summer/CTF-RSA-tool
命令:
python solve.py --verbose -k examples/jarvis_oj_mediumRSA/pubkey.pem --decrypt examples/jarvis_oj_mediumRSA/flag.enc
得到flag

easy_ecc

ECC算法和以及解码方式

python脚本:

import collections import random  EllipticCurve = collections.namedtuple('EllipticCurve', 'name p a b g n h')  curve = EllipticCurve(    'secp256k1',    # Field characteristic.    p=int(input('p=')),    # Curve coefficients.    a=int(input('a=')),    b=int(input('b=')),    # Base point.    g=(int(input('Gx=')),       int(input('Gy='))),    # Subgroup order.    n=int(input('k=')),    # Subgroup cofactor.    h=1, )   # Modular arithmetic ##########################################################  def inverse_mod(k, p):    """Returns the inverse of k modulo p.    This function returns the only integer x such that (x * k) % p == 1.    k must be non-zero and p must be a prime.   """    if k == 0:        raise ZeroDivisionError('division by zero')     if k < 0:        # k ** -1 = p - (-k) ** -1 (mod p)        return p - inverse_mod(-k, p)     # Extended Euclidean algorithm.    s, old_s = 0, 1    t, old_t = 1, 0    r, old_r = p, k     while r != 0:        quotient = old_r // r        old_r, r = r, old_r - quotient * r        old_s, s = s, old_s - quotient * s        old_t, t = t, old_t - quotient * t     gcd, x, y = old_r, old_s, old_t     assert gcd == 1    assert (k * x) % p == 1     return x % p   # Functions that work on curve points #########################################  def is_on_curve(point):    """Returns True if the given point lies on the elliptic curve."""    if point is None:        # None represents the point at infinity.        return True     x, y = point     return (y * y - x * x * x - curve.a * x - curve.b) % curve.p == 0   def point_neg(point):    """Returns -point."""    assert is_on_curve(point)     if point is None:        # -0 = 0        return None     x, y = point    result = (x, -y % curve.p)     assert is_on_curve(result)     return result   def point_add(point1, point2):    """Returns the result of point1 + point2 according to the group law."""    assert is_on_curve(point1)    assert is_on_curve(point2)     if point1 is None:        # 0 + point2 = point2        return point2    if point2 is None:        # point1 + 0 = point1        return point1     x1, y1 = point1    x2, y2 = point2     if x1 == x2 and y1 != y2:        # point1 + (-point1) = 0        return None     if x1 == x2:        # This is the case point1 == point2.        m = (3 * x1 * x1 + curve.a) * inverse_mod(2 * y1, curve.p)    else:        # This is the case point1 != point2.        m = (y1 - y2) * inverse_mod(x1 - x2, curve.p)     x3 = m * m - x1 - x2    y3 = y1 + m * (x3 - x1)    result = (x3 % curve.p,              -y3 % curve.p)     assert is_on_curve(result)     return result   def scalar_mult(k, point):    """Returns k * point computed using the double and point_add algorithm."""    assert is_on_curve(point)       if k < 0:        # k * point = -k * (-point)        return scalar_mult(-k, point_neg(point))     result = None    addend = point     while k:        if k & 1:            # Add.            result = point_add(result, addend)         # Double.        addend = point_add(addend, addend)         k >>= 1     assert is_on_curve(result)     return result   # Keypair generation and ECDHE ################################################  def make_keypair():    """Generates a random private-public key pair."""    private_key = curve.n    public_key = scalar_mult(private_key, curve.g)     return private_key, public_key    private_key, public_key = make_keypair() print("private key:", hex(private_key)) print("public key: (0x{:x}, 0x{:x})".format(*public_key)) 

最后的flag为公钥的两个值相加

具体原理见 https://www.jianshu.com/p/e41bc1eb1d81

有个简单点的脚本:

def power(x, y, mod):   r = 1   while( y ):   if y & 1:   r = (r * x) % mod   x = (x * x) % mod   y >>= 1   return r  Gx = 6478678675  Gy = 5636379357093  a = 16546484  b = 4548674875  p = 15424654874903  k = 546768  x = Gx  y = Gy  for i in range(k-1):   if (x==Gx and y==Gy):   inv = power(2*Gy, p-2,p)   temp = (3*Gx*Gx+a)*inv%p   else:   inv = power((x-Gx), p-2,p)   temp = (y-Gy)*inv%p   #print(temp)   xr = (temp*temp-Gx-x)%p   yr = (temp*(x-xr)-y)%p   #print(i,xr,yr)   x = xr   y = yr  print(x+y)  

flag 为:cyberpeace{19477226185390}

版权声明:玥玥 发表于 2021-08-23 18:27:01。
转载请注明:攻防世界crypto新手区wp | 女黑客导航