题目描述:Do you love yy ?
下载后查看文件类型,为64位程序
$ file yy
yy: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=a48620628ac444471e5ed0844b04d501eb5fd6ed, not stripped
拖进IDA分析:
main
:
int __cdecl main(int argc, const char **argv, const char **envp)
{
size_t flag_len; // rax
printf("give me flag:", argv, envp, argv);
__isoc99_scanf("%255s", flag); // lower、number、{、}、_、C、T、F
flag_len = strlen(flag);
yyin = fmemopen(flag, flag_len, "r");
yyparse();
return 0;
}
主要逻辑是读取flag,求出flag长度,调用yyparse
函数判断flag是否正确。
函数名一栏中,发现大量与yy
有关的变量、函数。
通过搜索,发现与lex(词法分析器)、yacc(语法分析器)有关,属于编译原理的知识,由于没学过,直接搜索相关例子分析一下:
如下:
test.lex
%{
int wordCount = 0;
int spaceCount = 0;
int numberCount = 0;
%}
chars [A-Za-z\_\'\.\"]
numbers ([0-9])+
delim [" "\n\t]
whitespace {delim}+
words {chars}+
%%
{words} {wordCount++;}
{whitespace} {spaceCount++;}
{numbers} {numberCount++
附件是段.swf影片
用工具得到各帧
共441=21*21帧
21帧一行,按顺序逐行排列,得到二维码,扫出前半段flag
把.swf转换为.mp3
使用Audacity打开,将波形图转换为频谱图,得到后半段flag