Advertisement

buuctf刷题记录(7)

阅读量:

[FlareOn4]IgniteMe

例行查壳:

在这里插入图片描述

无壳32位,拖入IDA:

在这里插入图片描述

跟进,然后交叉引用列表:

在这里插入图片描述

然后F5查看伪代码:

在这里插入图片描述

在伪代码中,可以发现两个关键函数sub_4010F0sub_401050,先查看sub_4010F0

在这里插入图片描述

这段代码的主要功能大致是:首先读取输入字符串;接着计算Buffer字符串的长度;最后筛选出那些既不是12也不是13且非零值,并将这些符合条件的数据存入数组byte_469679[i]中;接下来检查sub_469688的状态:

在这里插入图片描述

这段的意思是说:首先将变量byte_403078[i]的字符串长度赋值给变量V₀,在此基础上使用for循环结构对其进行逆序处理,并在此过程中让相邻的两个元素执行异或运算。随后再用另一个for循环来进行比较,在此过程中函数sub_₄₀₁₀₀₀的作用是返回固定的数值常量。这样就确定了变量v₄的值为4。整个流程的核心逻辑即是对输入数据实施逆序处理后依次执行异或运算,并最终完成数据比对

复制代码
    #include <stdio.h>
    int main()
    {
    	int i;
    	char v4=4;
    	char a[] =
    	{
    		0x0D, 0x26, 0x49, 0x45, 0x2A, 0x17, 0x78, 0x44, 0x2B, 0x6C,
    		0x5D, 0x5E, 0x45, 0x12, 0x2F, 0x17, 0x2B, 0x44, 0x6F, 0x6E,
    		0x56, 0x09, 0x5F, 0x45, 0x47, 0x73, 0x26, 0x0A, 0x0D, 0x13,
    		0x17, 0x48, 0x42, 0x01, 0x40, 0x4D, 0x0C, 0x02, 0x69, 0x00
    	};
    	char b[0x27];
    	for (i=0x27; i>=0; i--)
    	{
    		b[i]=v4^a[i];
    		v4=b[i];
    	}
    	for(i=0; i<0x27; i++)
    	{
    		printf("%c",b[i]);
    	}
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

运行结果:

在这里插入图片描述

最后提交的结果就是:

flag{R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com}

[WUSTCTF2020]Cr0ssfun

查壳:

在这里插入图片描述

无壳,64位,直接拖入IDA中:

在这里插入图片描述

跟进,查看伪代码:

在这里插入图片描述

查看关键函数check

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后整理一下得到:

enc = [119,99,116,102,50,48,50,48,123,99,112,112,95,64,110,100,95,114,51,118,101,114,115,101,95,64,114,101,95,102,117,110,125]

然后脚本:

复制代码
    enc = [119,99,116,102,50,48,50,48,123,99,112,112,95,64,110,100,95,114,51,118,101,114,115,101,95,64,114,101,95,102,117,110,125]
    flag = ""
    for i in range(len(enc)):
    flag += chr(enc[i])
    print(flag)
    
    
      
      
      
      
      
    
    AI写代码

运行结果为:

在这里插入图片描述

最终提交的答案:

flag{cpp_@nd_r3verse_@re_fun}

全部评论 (0)

还没有任何评论哟~