2022HNCTF-re部分题解

[HNCTF 2022 WEEK3]Double

目录

[HNCTF 2022 WEEK3]Double

 [HNCTF 2022 WEEK2]e@sy_flower

[HNCTF 2022 WEEK2]TTTTTTTTTea


以下都是第一次见得、刚接触的,所以记录,有些简单的就没有记录,当然还有好多不会的。。。

题目链接:NSSCTF - [HNCTF 2022 WEEK3]Double (ctfer.vip)

题目下载:下载

双进程通信知识点参考:linux管道pipe详解_程序员的成长之路的博客-CSDN博客_pipe管道

有关双进程通信的简单re题,虽然基础的很简单,但是第一次见也要记录一下

拖入IDA,查看主函数代码

首先执行if的子句,先读取数据放入buf数组中,然后在把读入的buf数据写入进程中,所以buf即为flag,根据异或求flag即可

加密逻辑

arr[i^input[i]]==enc[i]

则i^input[i] == arr.index(enc[i])

enc=[8108,20369,14230,46468,3608,49634,29552,8108,43136,47345,9019,29552,10168,20369,60168,35756,22784,12417,19994,22941,23523,23625,62779,65498,47727,15965,10168,23377,35376,10768]
arr[数据(IDA中可查询)]
flag=''
for i in range(len(enc)):
    flag+=chr(arr.index(enc[i])^i)
print(flag)

 [HNCTF 2022 WEEK2]e@sy_flower

题目链接NSSCTF - [HNCTF 2022 WEEK2]e@sy_flower (ctfer.vip)
下载:下载

简单花指令学习

拖入IDA,f5发现不能正常查看代码,判断是花指令影响IDA进行解析。找到主函数

根据常见的花指令,jmp处按D, 然后unk_4010D5处数据按C,变为代码

变为正常的汇编代码了,然后把上面的db 0E9h数据nop掉,点Edit->patch program->change byte,把其原来首数据变为90即可,在按c变为汇编代码。再在主函数处按P,解析成函数即可f5了。

变为

在分析即可获得flag

#include <stdio.h>
#include <string.h>
int main(){
	char str1[]="c~scvdzKCEoDEZ[^roDICUMC";
	char flag[24]={0};
	int i,v5;
	for(i=0;i<24;i++){
		flag[i]=str1[i]^48;
	} 
	for(i=0;i<12;i++){
		v5=flag[2*i];
    	flag[2*i]=flag[2*i+1];
    	flag[2*i+1]=v5;
	}
	
	printf("%s",flag);
}

[HNCTF 2022 WEEK2]TTTTTTTTTea

题目链接:NSSCTF - [HNCTF 2022 WEEK2]TTTTTTTTTea (ctfer.vip)

题目:下载

简单xtea加密学习

拖入IDA,主函数查看代码

分析:把flag放入v4数组中,然后经过tea_encrypt加密后和v4数组前6个数组分别对应相等,进入加密函数,

 可以发现是xtea加密,所以直接求flag即可。注意:key数组为4字节,所以数据变为dd类型(类型处按d即可)

#include <stdio.h>
int main(){
	unsigned int l,r;
	unsigned int v4[6]={-1054939302,-1532163725,-165900264,853769165,768352038,876839116};
	int flag[6]={0};
	unsigned int delta;
	unsigned int key[4]={0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f};
	int i,j;
	for(i=0;i<6;i+=2){
		l=v4[i];
		r=v4[i+1];
		delta=-32*1640531527;
		for(j=0;j<32;j++){
			r -= (((l >> 5) ^ (l*16)) + l) ^ (key[(delta>>11)&3]+ delta);//*16==<<4 
    		delta += 1640531527;
    		l -= (((r >> 5) ^ (r*16)) + r) ^ (key[delta&3]+ delta);
		}
		flag[i]=l;
		flag[i+1]=r;
	}
	char *p = (char*)flag;
	//for(i=0;i<6;i++)
	//	printf("%#x",flag[i]);
	for(i=0;i<24;i++){
		printf("%c",*p);
		p++;
	}
}

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值