练习一:
666c61677b616537333538376261353662616566357d
, ①利用print函数直接输出flag。②将flag存放到变量里,最后输出变量的值。思路:十六进制转换成10进制——十进制转换成ASCII码。
方法一:
>>> a = '666c61677b616537333538376261353662616566357d'
>>> len(a) #len()函数查看a变量的长度,共计44个字符
44
>>> for i in range(0,len(a),2): #从0开始,到44结束,因为左闭右开,从0开始,不包含44
# ... print(a[i:i 2]) #第一次取值为0,0:2,取0到1位。第二次取值2,2:4取2到3位,依次取值
# ... print(int(a[i:i 2],16)) #把出来成对的值转换为十进制数
# ... print(chr(int(a[i:i 2],16))) #把十进制转换为ASCII码
... print(chr(int(a[i:i 2],16)),end='') #end参数变为空,禁止换行
...
flag{ae73587ba56baef5}>>> #解出最终的flag
方法二:
>>> a = '666c61677b616537333538376261353662616566357d'
>>> flag = '' #给flag定义变量为空值
>>> for i in range(0,len(a),2):
... flag = flag chr(int(a[i:i 2],16)) #flag = flag累加依次输出的ASCII码字符
...
>>> flag
'flag{ae73587ba56baef5}'
练习二:
d4e8e5a0f1f5e9e3eba0e2f2eff7eea0e6eff8a0eaf5edf0a0eff6e5f2a0f4e8e5a0ece1faf9a0e4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0c2c4c3d4c6fbd9b0f5dfe1f2e5dff3ede1f2b7fd
要求:需要将每一组二进制数最高位的1去掉,也就是转换成十进制之后再减去128。
2的七次方为128,每组转换十进制数都减去128寓意二进制去掉了最高位的1。具体代码如下
>>> for i in range(0,len(a),2):
... print(chr(int(a[i:i 2],16)-128),end='') #每组十进制数减去128
...
The quick brown fox jump over the lazy dog! The flag is: BDCTF{Y0u_are_smar7}>>>
练习三:
d87 x65 x6c x63 o157 d109 o145 b100000 d116 b1101111 o40 x6b b1100101 b1101100 o141 d105 x62 d101 b1101001 d46 o40 d71 x69 d118 x65 x20 b1111001 o157 b1110101 d32 o141 d32 d102 o154 x61 x67 b100000 o141 d115 b100000 b1100001 d32 x67 o151 x66 d116 b101110 b100000 d32 d102 d108 d97 o147 d123 x31 b1100101 b110100 d98 d102 b111000 d49 b1100001 d54 b110011 x39 o64 o144 o145 d53 x61 b1100010 b1100011 o60 d48 o65 b1100001 x63 b110110 d101 o63 b111001 d97 d51 o70 d55 b1100010 d125 x20 b101110 x20 b1001000 d97 d118 o145 x20 d97 o40 d103 d111 d111 x64 d32 o164 b1101001 x6d o145 x7e
以上内容包含了二进制,八进制,十进制,十六进制数,如何转换成为ASCII码?
#!/usr/bin/python3
a = 'd87 x65 x6c x63 o157 d109 o145 b100000 d116 b1101111 o40 x6b b1100101 b1101100 o141 d105 x62 d101 b1101001 d46 o40 d71 x69 d118 x65 x20 b1111001 o157 b1110101 d32 o141 d32 d102 o154 x61 x67 b100000 o141 d115 b100000 b1100001 d32 x67 o151 x66 d116 b101110 b100000 d32 d102 d108 d97 o147 d123 x31 b1100101 b110100 d98 d102 b111000 d49 b1100001 d54 b110011 x39 o64 o144 o145 d53 x61 b1100010 b1100011 o60 d48 o65 b1100001 x63 b110110 d101 o63 b111001 d97 d51 o70 d55 b1100010 d125 x20 b101110 x20 b1001000 d97 d118 o145 x20 d97 o40 d103 d111 d111 x64 d32 o164 b1101001 x6d o145 x7e'
b = a.split() #用split函数切割a为列表的形式
flag = '' #定义flag变量为空
for i in b: #i值在列表b内进行循环
if i[0] == 'd': #如果字符段第一位为d
flag = flag chr(int(i[1:],10)) #则认为是十进制数,转换成ASCII码累加到flag变量
elif i[0] == 'x': #如果字段符第一位为x
flag = flag chr(int(i[1:],16)) #则认为是十六进制数,转换成ASCII码累加到flag变量
elif i[0] == 'o': #如果字段符第一位为o
flag = flag chr(int(i[1:],8)) #则认为是八进制数,转换成ASCII码累加到flag变量
elif i[0] == 'b': #如果字段符第一位为b
flag =flag chr(int(i[1:],2)) #则认为是二进制数,转换成ASCII码累加到flag变量
print(flag) #最后输出flag变量
[root@localhost python]# ./test5.py
Welcome to kelaibei. Give you a flag as a gift. flag{1e4bf81a6394de5abc005ac6e39a387b} . Have a good time~
练习四:
011001100110110001100001011001110111101101111010011010000100010101100011001110010011000000110011001101000110101001101111011001000111001101101010011001100110111101110011011010110110111101111101
题意:二进制转换成ASCII码
方法一
>>> a = '011001100110110001100001011001110111101101111010011010000100010101100011001110010011000000110011001101000110101001101111011001000111001101101010011001100110111101110011011010110110111101111101'
>>> for i in range(0,len(a),8):
... print(chr(int(a[i:i 8],2)),end='')
...
flag{zhEc9034jodsjfosko}>>>
方法二:
>>> flag = ''
>>> for i in range(0,len(a),8):
... flag = flag (chr(int(a[i:i 8],2)))
...
>>> flag
'flag{zhEc9034jodsjfosko'
解释:
for i in range(0,len(a),8):
从0~192内循环,步长为8。print(chr(int(a[i:i 8],2)),end='')
a[i:i 8]
指:i取值为0,a[0:8],取编号0~7的8个数。i取值为8,a[8:16],取编号8~15的8个数。
回顾:
表达式int(‘11111’, 2)的含义。
11111为二进制数,转换为十进制数
表达式chr(ord(‘D’) 2)的含义。
ord返回D的ASCII码,再加上2再转换成ASCII对应字符
表达式isinstance(‘Hello world’, str)的含义。
查询 Hello word 是否属于 字符str类
表达式’abc’ in ‘abcdefg’的值为?
True
表达式‘Hello World’[-5:]的值为?
'W'