分析
打开题目尝试打开然后报错
以为是很麻烦的一件事,然后搜索这个报错,好像是QT框架相关的编译问题。MinGw有关。但是神奇的是可以在OD里动态调试。
先看IDA静态分析。
外面的逻辑很简单,输入一个长度大于19小于30的字符串,即可进入check部分。跟进查看
这样看懂,这题基本就解出来了。因为可以看出,参与异或的字符与我们的输入无关,所以直接使用动态调式将每次参与异或的值记录下来即可。参与cmp的值同理。
直接python脚本
def circular_shift_left (int_value,k=2,bit = 8): #循环右移函数
bit_string = '{:0%db}' % bit
bin_value = bit_string.format(int_value) # 8 bit binary
bin_value = bin_value[-k:] + bin_value[:-k]
int_value = int(bin_value,2)
return int_value
a=[0x1A,0XA2,0X2F,0XF9,0X94,0X43,0X3C,0XC4,0X4D,0XD8,0X8C,0XC5,0X5B,0xb6,0x6e,0xea,0xa3,0x3c,0xc9,0x9b,0xbc,0xca,0xad,0xd7,0x7e]
b="F 87 62 14 01 C6 F0 21 30 11 50 D0 82 23 AE 23 EE A9 B4 52 78 57 0C 86 8B"
b=[int("0x"+b.split(' ')[i],16) for i in range(len(b.split(' ')))]
c=[chr(circular_shift_left(b[i]^a[i])%256) for i in range(len(b))]
flag=''.join(c)
print(flag)
#EIS{ea3y_r7Eve0rSe_r1ghT}
总结
该题是一个普通算法题,题目本身没有学到什么东西。题目之外学到的东西有关于Python脚本的一些书写。其中有关于join函数的使用,在列表里使用for循环快速创建列表等。其实今天做了两题这个,但是做的第一题太过于签到题,就没有记录。总体小进步吧
今日剩余计划:
- 学习课程知识
- pediy 18-10,关于堆溢出
明日计划
攻防世界下一题。