CTF实验吧——证明自己吧

题目地址:http://www.shiyanbar.com/ctf/28

没有壳 ,vc++ 写的

拖进OD观察观察,发现代码很短哟,先来看这俩个call 怀疑他们其中有正确的flag和我们输入的东西对比

强行爆破完寄存器里是没有正确的flag出现的,肯定是在某个函数里算出来的。

再进IDA里 main 空格,发现 关键函数就是sub_401060

双击进入查看sub_401060的伪C代码

分成三个部分:

第一,将我们输入的a1与v5的长度比较,将a1的每一项都进行异或。

第二,将v5的每一项都减去5

第三,可以当成这样看, while(   *(a1 + v3) == *(_BYTE *)&V5+V3)    ) 就是把我们输入的a1与v5逐个比较

ps:这里的if(strlen((const char *)v5)==0)return 1;判断v5元素为0个就返回1,没啥用。有点迷惑,不管他。

所以 这里我们逆推,先将v5减去5再异或(注意异或的性质 顺序不要搞错了),不就得到了应该输入的正确的值了吗

v5的数据可以根据地址去寻找,v5=dword_40708C ,这里用OD比较方便 ctrl+G,因为V5是字符串,所以指向的是该字符串的首地址,则V5为 68 57 19 48 50 6e 58 78 54 6a19 58 5e 06(都为十六进制)

拿下来,用python或者C语言写脚本即可解得答案。

python:

a=" "
code=(0x68,0x57,0x19,0x48,0x50,0x6E,0x58,0x78,0x54,0x6A,0x19,0x58,0x5E,0x06)
for i in code:
    i=(i-5)^0x20
    a+=chr(i)
print(a)

 C:

#include<stdio.h>
int main()
{
int a[14]={0x68,0x57,0x19,0x48,0x50,0x6e,0x58,0x78,0x54,0x6a,0x19,0x58,0x5e,0x06};
int i;
for(i=0;i<14;i++)
{
a[i]=a[i]-5;
a[i]=a[i]^0x20;
printf("%c",a[i]);
}
return 0;
}

验证一下,对的

猜你喜欢

转载自www.cnblogs.com/tqing/p/11494705.html
今日推荐