【CTF对抗-SWPUCTF 2021 新生赛 re1 WriteUp】此文章归类为:CTF对抗。
SWPUCTF 2021 新生赛 re1 WriteUp
概览
首先运行这个软件,查看运行效果
可以看到,该程序就是一个简单的输入flag,输入错误则结束。
使用exeinfo查看exe是否有加壳
可以看到,该程序是一个64位程序,并未进行任何加壳处理,因此将该程序直接使用IDA打开,进行静态分析
静态分析
在IDA的反汇编代码中首先看到了程序输入的流程,可以知道,用户的输入存储在Str1这个变量之中
完成输入之后,将var_4变为了0,随后进行跳转,此处初步怀疑是一个for循环,var_4极有可能是i
跳转之后,紧跟又是对var_4的比较与跳转,已经基本可以判断是for循环的结构,此处也可按空格键,转换为流程控制视图观察验证结果
因此将var_4重命名为i辅助分析,并转至401595分析for循环逻辑
可以看到如上代码是对Str1,即用户输入的操作进行遍历操作,将字符串中的e全部变为了3
完成循环后,执行的代码位于4015CC,因此可以看到,此处再次将i的值变为了0,跟进至401603处观察
可以看到,此处又是一个for循环,该循环的作用的是将用户输入的字符串中的‘a'全部变为’4‘
随后便对Str1和Str2进行了比较,如相等则输出“you are right!”,由此可知Str2便是解题的关键
定位至Str2的赋值处
此处便是通过dword,word和byte类型,对Str2的赋值。由这些16进制数我们就可以知道每个字符的ascii码是多少。此处需要注意由于小端存储,因此此处还原时需要进行逆序
编写解题代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h>
int main()
{
char szFlag[] = {
0x7b, 0x33, 0x34, 0x73,
0x79, 0x5f, 0x72, 0x33,
0x76, 0x33, 0x72,0x73,
0x33,0x7d,0
};
for ( int i = 0; i < 15; i++)
{
if (szFlag[i] == '4' )
{
szFlag[i] = 'a' ;
}
if (szFlag[i] == '3' )
{
szFlag[i] = 'e' ;
}
}
printf ( "%s" , szFlag);
return 0;
}
|
更多【CTF对抗-SWPUCTF 2021 新生赛 re1 WriteUp】相关视频教程:www.yxfzedu.com