[HNCTF 2022 WEEK3]Double
目录
以下都是第一次见得、刚接触的,所以记录,有些简单的就没有记录,当然还有好多不会的。。。
题目链接: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++;
}
}