攻防世界getit做法(一个隐含的小指针)

首先下载附件,然后进行查壳操作,发现是64bit的,那就拖进ida64中接着我们再进入main函数查看,并进行简单的分析,可以在一旁写上注释这边最关键的一句话,在于*(&t + i + 10)=s[i] + v3  ,其中s数组为已知,点进去复制出来,这边有一个注意的点,*(&t)这边有*运算符,联想到是应用指针了,那后面的+i+10,就可以理解为是从地址t开始往后的第+i+10位,也就是说*(),该括号内表示的是t的地址,然后我们点进s看看,这边有一个小坑,就是需要选中53h,然后按a将其转换为字符形式,然后就会变成SharifCTF,这点一定要记得!然后嘞,我们写代码就行了,上代码


#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	char s[]="c61b68366edeb7bdce3c6820314b7498";
	int v3;
	char flag;
	for(int i=0;i<strlen(s);++i)
	{
		if((i&1)!=0){
			v3=1;
		} else {
			v3=-1;
		}
		flag=s[i]+v3;
		cout<<flag;
	}
	return 0;
}

根据原代码,照葫芦画瓢就行,s是已知数组,最后得到结果

b70c59275fcfa8aebf2d5911223c6589

然后再把之前的前缀加上去,就得出正确的flag喽

总结一下,这道题不难的,我当时没做出就是那个53h没转换为字符形式,然后就不会了,这道题对于其他人来说,做不出来的点应该是那个*()这边没有弄明白,所以我们看到*需要敏感,联想到指针,括号内的就当作是地址就行。

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值