加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

CTF实验吧——证明自己吧

发布时间:2020-12-16 09:16:44 所属栏目:百科 来源:网络整理
导读:题目地址:http://www.shiyanbar.com/ctf/28 没有壳 ,vc++ 写的 ? 拖进OD观察观察,发现代码很短哟,先来看这俩个call 怀疑他们其中有正确的flag和我们输入的东西对比 强行爆破完寄存器里是没有正确的flag出现的,肯定是在某个函数里算出来的。 ? 再进IDA里

题目地址: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,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,0x6e,0x6a,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;
}

验证一下,对的

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读