矿大BXCCTF-RE-入门5

今天起把链接也复制上,题目链接:http://bxs.cumt.edu.cn/challenge/reverse/%E8%AF%BE%E5%A0%825.exe

打开程序,exe文件显示输入flag,直接拖入IDA,如题目描述为简单算法题。

大致流程为输入一个flag,再进行加密,然后与一个已知的字符串进行匹配。

已知字符串在这里,我把它截取下来。

阅读知sub_401180函数与我们的输入无关,然后下面的sub-41230函数将利用v18处的字符串对V22进行加密,V22是输入字符串V4的一个拷贝。

阅读算法

也很好读懂, v4从1开始增长,v7=a1[v4],v5=(v7+v5)%256,然后交换a1[v4]与a1[v5] 再用字符串的每一个与a1[(a1[v4]+v7)%256]进行异或操作后得到已知字符串。

这里静态观察不太好获取a1处的数据,所以使用OD进行动态调试观察。

经过多次尝试后,将断点设在

一个断点是用于输入,另一个是用于记录数据。

在这里观察到ecx从1开始,每次从[ecx+eax]处的地址取一个数据,不难知道ecx即是v4,eax即是a1

在数据处ctrl G跳转到eax处的数据即可看到a1的全部数据。

然后将eax处的数据拷贝下来,自己写脚本。

import re
a1=[]
b=[0x6E,0x63,0xE5,0x80,0x69,0x35,0x1D,0x76,0x81,0x72,0x2f,0xb5,0x65,0xaa,0x91,0xde]
f = open("text.txt")
s=f.read()
s1 = re.split(' ', s) #利用正则函数进行分割
for i in s1:
    a1.append(int(i,16))
v5=0
j=0
for i in range(1,len(b)):
       v7=a1[i]
       v5=(v7+v5)%256
       a1[i]=a1[v5]
       a1[v5]=v7
       b[j]^=a1[(a1[i]+v7)%256]
       j=j+1

数据格式为

但结果总是只有第一个字符正确,其余全部出错。自己没有找到错在哪里,所以使用了其他的方法并找到了可能导致出错的地方。

这里用到刚刚设的第二个断点,观察汇编代码可知,在

ebx即是每次这里的结果。

猜测第二次出错的原因,ebx在第二次本来=(0xEA%256)=0xEA,但是这里却显示

所以这里第二次的结果为00,而非自己的脚本跑出的结果。

我还是没有具体明白错在哪,但是索性直接这样循环16次,把每次数据记录下来与已知字符串逐个异或

最终得到答案 flag='rc4_I5_v3ry_e4sy'

猜你喜欢

转载自blog.csdn.net/qq_38025365/article/details/82927454