本文最后更新于223 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言
一道新手赛的题目,很简单。但是存在一个我不会的地方,可以记录一下。
逻辑很简单,如图
就是考查异或,但是看题目好像也有大小端序的考查
点进array可以看到,也是数值很大的十六进制数字,要和0x12345678进行异或,应该就可以得到flag
一般我们将数字转换成字符都是用python中的chr(),Ascii码表的范围是0~127,当然chr()函数还可以接收数值更大的参数,输出一些其其怪怪的字符。但是像这题的数值太大它会报错,如图
那怎么将我们异或后得到的数据转换成字符,转换成flag呢,答案就是int.to_bytes()函数,也就是说我们将这些大的数字转换成字节串,这点做密码的时候也是,大的数值一般都是转化成字节串。
Python的int.to_bytes()函数用于将一个整数转换为指定长度的字节序列。语法
int.to_bytes(length, byteorder, signed=False)
length
:指定字节序列的长度,必须是一个大于等于0的整数。byteorder
:指定字节序列的字节顺序,可以是'big'
或'little'
,分别代表大端序和小端序。signed
:可选参数,指定是否支持有符号数,默认为False
,即只支持无符号数。
我们对上面的数据array按d,然后可以发现第一个数据的75在高地址,然后也在高位,所以数据是小端序的模式,然后两个十六进制数字是一个字节,所以是一个数据是四个字节,然后写脚本解决。
脚本如下
data=[0x75553A1E,0x7B583A03,0x4D58220C,0x7B50383D,0x736B3819]
flag=b''
for i in range(5):
flag+=(data[i]^0x12345678).to_bytes(4,'little')
print(flag)
#b'flag{llittl_Endian_a'
然后再加个括号就是flag,flag{llittl_Endian_a}