cryptohack wp (INTRODUCTION TO CRYPTOHACK篇)
INTRODUCTION TO CRYPTOHACK
第一题 (ASCII)
一道简单的ASCII码转换,直接用题目的提示代码解就行了
ascii=[99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, 51, 125]
flag=""
for i in ascii:
flag+=chr(i)
print(flag)
第二题(Hex)
Hex编码的原理就是将原来8位的二进制字节打断,分成两个4位的,并且在前面加上4个零,进行补位这样一个8位二进制字节就变成了2个8位的二进制字节,在将新得到的2个二进制字符进行16位进制转换得到的新的16位字符串就是Hex的值。
hex编码就是16进制编码,是字符的[ascii码](https://so.csdn.net/so/search?q=ascii码&spm=1001.2101.3001.7020)值的16进制表示,所以解码时一般先转为ascii码,后转为字符串形式。
代码如下:
import binascii
hex ='63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d'
print(bytes.fromhex(hex))
print(binascii.a2b_hex(hex))
或者
from Crypto.Util.number import *
import libnum
hex =0x63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d
print(libnum.n2s(int(hex)))##注意,libnum库中将16进制转字符串时,必须转为int类型,不然会报错
print(long_to_bytes(hex))
像这题题,可以应用python的很多库,如libnum库,binascii库,等等。
第三题(base64)
代码如下:
import base64
from Crypto.Util.number import *
hex =0x72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf
base = long_to_bytes(hex)
flag=base64.b64encode(base)
print(flag)
先解16进制码为字节,然后再解base64
第四题
密文:11515195063862318899931685488813747395775516287289682636499965282714637259206269
代码如下:
from Crypto.Util.number import *
import libnum
s = 11515195063862318899931685488813747395775516287289682636499965282714637259206269
print(long_to_bytes(s))
print(libnum.n2s(s))
接着昨天的题目
第五题
看题目,一道简单的xor题,就是将“label中每个字符与13进行异或处理”,直接上代码:
s="label"
result = ""
for i in s:
result+=chr(ord(i)^13)
print(result)
或者按照题目所说,用pwntools库中的xor函数来进行异或操作,具体操作如下:
from pwn import xor
s1 = "label"
s2 = 13
result = xor(s1,s2)
print(result)
第六题
按照题目所给:
KEY1 = a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
KEY2 ^ KEY1 = 37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
KEY2 ^ KEY3 = c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
FLAG ^ KEY1 ^ KEY3 ^ KEY2 = 04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf
对其进行分析:(KEY2 ^ KEY1) ^ KEY1 = KEY2 ^ (KEY1 ^ KEY1) = KEY2 ^ 0 = KEY2
同理:KEY2 ^ (KEY2 ^ KEY3) = (KEY2 ^ KEY2) ^ KEY3 = 0 ^ KEY3 = KEY3
即:(FLAG ^ KEY1 ^ KEY3 ^ KEY2) ^ KEY1 ^ KEY3 ^ KEY2 = FLAG
代码如下:
from pwn import xor
from binascii import unhexlify
k1 = 'a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313'
k21 = '37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e'
k23 = 'c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1'
fk123 = '04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf'
k2 = xor(unhexlify(k21),unhexlify(k1))
print(k2)
k3 = xor(unhexlify(k23),k2)
print(k3)
flag = xor(unhexlify(fk123),unhexlify(k1),unhexlify(k23))
print(flag.decode())
第七题
通过题目我们能知道这道题是将flag通过与一个简单的字节进行异或操作,我们可以通过遍历这个字节从而拿到flag
代码如下:
s = '73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d'
decode_s = bytes.fromhex(s)#根据题目提示,先进行16进制解码
print(decode_s)
#接下来遍历可能的异或
for i in range(256):
flag = ''.join(chr(j^i) for j in decode_s)
print(str(i) + ":" + flag)
在一堆乱码中找到flag
第八题
一般他给的注意就是解题的关键,题目说注意题目格式,且只给了密文,猜测前面几个字节与“crypto{”有关,先解码在进行异或试试,如下,解出key:
s = '0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104'
decode_s = bytes.fromhex(s)#根据题目提示,先进行16进制解码
print(decode_s)
k = "crypto{"
key = ""
for i in range(7):
key +=(chr(ord(k[i])^decode_s[i]))
print(key)
解的key为:myXORke,由于直接异或操作flag错误,猜测key为:myXORkey,结果对了,ctf题中需要猜测的地方还是挺多的。。。。
from pwn import xor
key = key + "y"
flag = xor(decode_s,key.encode())
print(flag)