WriteUp
下载题目附件,得到一个部分加密的压缩包veryeasy.zip
,其中未加密的文本文件你猜呀.txt
内容为:INbRdP5NtO5JWP53rO5JcRbRgQKc+
,先猜测是base64
编码,但是解码失败了,于是就拿工具挨个去试,发现用xx
编码进行解密并不会出现乱码,所以先猜测是xx
编码,得到fwilvyhublqwhuhvwlqj
。
这种就很像栅栏
或者古典字符替换
类的密码了,试了一下栅栏
,各种栏数都不是可读明文,于是去试了一下古典字符替换
类密码中最经典的凯撒
密码,在偏移为3
时得到可读明文ctfisveryinteresting
。
使用上述密码解压,得到等一下,我密码呢.rar
,再次解压得到reverse
文件。
查看文件头为ELF
,可知是二进制程序,直接ida
进行静态分析。
没有任何入口伪装,主要代码就在main
函数中,内容如下:
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
int stat_loc; // [rsp+4h] [rbp-3Ch]
int i; // [rsp+8h] [rbp-38h]
__pid_t pid; // [rsp+Ch] [rbp-34h]
char s2; // [rsp+10h] [rbp-30h]
unsigned __int64 v8; // [rsp+28h] [rbp-18h]
v8 = __readfsqword(0x28u);
pid = fork();
if ( pid )
{
argv = (const char **)&stat_loc;
waitpid(pid, &stat_loc, 0);
}
else
{
for ( i = 0; i <= strlen(&flag); ++i )
{
if ( *(&flag + i) == 105 || *(&flag + i) == 114 )
*(&flag + i) = 49;
}
}
printf("input the flag:", argv);
__isoc99_scanf("%20s", &s2);
if ( !strcmp(&flag, &s2) )
result = puts("this is the right flag!");
else
result = puts("wrong flag!");
return result;
}
其中flag
变量为{hacking_for_fun}
。分析代码可知,将flag
变量处理后,就直接进行输入等价判断,所以处理后的flag
值就是flag。处理循环如下:
{
if ( *(&flag + i) == 105 || *(&flag + i) == 114 )
*(&flag + i) = 49;
}
可以发现就是简单的指定字符替换,将i
和r
替换成1
,所以手动替一下就能得到flag。
flag
{hack1ng_fo1_fun}