逆向思维|有趣的移位运算和或运算

逆向思维|有趣的移位运算和或运算

今天做到一道题,大家可以看看怎么去逆,挺有趣的

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]000000000000000000000000
    00000000flag1[i+1]0000000000000000
    0000000000000000flag1[i+2]00000000
    000000000000000000000000flag1[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}'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值