buuctf刷题记录(7)
发布时间
阅读量:
阅读量
[FlareOn4]IgniteMe
例行查壳:

无壳32位,拖入IDA:

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

然后F5查看伪代码:

在伪代码中,可以发现两个关键函数sub_4010F0和sub_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)
还没有任何评论哟~
