逆向思维|有趣的移位运算和或运算
今天做到一道题,大家可以看看怎么去逆,挺有趣的
if len(flag1) == 24:
for i in range(0, len(flag1), 4):
b = ord(flag1[i]) << 24 | ord(flag1[i + 1]) << 16 | ord(flag1[i + 2]) << 8 | ord(flag1[i + 3])
value.append(b)
如果在已知value列表的情况下 怎样逆向得出flag1
这是一个关于移位和或运算在一起的逆向
关键点如下:
-
flag1里每一个字符在ascii码里都小于127,也就是小于等于8位二进制
-
或运算 0|1 = 1
-
依次移位的位数为24,16,8,0
-
根据第一点,flag1每个字符我们都看做8位二进制,那么可以想象b的组成
-
以下表格每一行代表一个移位运算:第一行为ord(flag1[i]<<24)
flag1[i] 00000000 00000000 00000000 00000000 flag1[i+1] 00000000 00000000 00000000 00000000 flag1[i+2] 00000000 00000000 00000000 00000000 flag1[i+3] 再根据第二点或运算,这四行或运算结果也就很明朗了
b的组成其实就是每八位都是一个flag字符flag1[i]flag1[i+1]flag1[i+2]flag1[i+3]
这时我们可以直接利用long_to_bytes直接解出flag
from Crypto.Util.number import long_to_bytes
list = [1718378855, 2071089977, 1415989042, 1749693291, 1278635330, 829305213]#这个是已经解出来的value
flag = b''
for i in list:
flag += long_to_bytes(i)
print(flag)
#b'flag{rS9TfG2hJ3kL6mB1n1}'