[WMCTF2020]easy_re

64位无壳,IDA打开并没有发现“please input the flag:”字符串,别的提示字符串也找不到,

搜一下perl,Perl 是 Practical Extraction and Report Language 的缩写,可翻译为 “实用报表提取语言”。

Perl 是高级、通用、直译式、动态的程序语言。

Perl 最初的设计者为拉里·沃尔(Larry Wall),于1987年12月18日发表。

Perl 借用了C、sed、awk、shell脚本以及很多其他编程语言的特性。

Perl 最重要的特性是Perl内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。

看了别人的博客找到了看雪一篇文章,里面程序执行过程中会用script解压你压缩的源程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
perl是解释语言,perlapp只是把你的perl程序压缩后放在资源里面,执行的时候会解压的。

00405276 |. 83C4 0C |add esp, 0C
00405279 |. 8945 F0 |mov dword ptr [ebp-10], eax
0040527C |. 85C0 |test eax, eax
0040527E |. 0F84 83000000 |je 00405307
00405284 |. 68 5CCF4000 |push 0040CF5C ; ASCII "script"
00405289 |. 50 |push eax
0040528A |. 8B03 |mov eax, dword ptr [ebx]
0040528C |. FF30 |push dword ptr [eax]
0040528E |. E8 CBEFFFFF |call 0040425E
00405293 |. 83C4 0C |add esp, 0C
00405296 |. 8943 24 |mov dword ptr [ebx+24], eax
00405299 |. 85C0 |test eax, eax
0040529B |. 0F84 32020000 |je 004054D3
004052A1 |. 68 50CF4000 |push 0040CF50 ; /s = "hashline"
004052A6 |. FF75 F0 |push dword ptr [ebp-10] ; |/s
004052A9 |. E8 38360000 |call <jmp.&MSVCRT.strlen> ; |\strlen
004052AE |. 8BD8 |mov ebx, eax ; |
004052B0 |. C70424 40CF40>|mov dword ptr [esp], 0040CF40 ; |ASCII "-e#line 1 ""%s"""
004052B7 |. E8 2A360000 |call <jmp.&MSVCRT.strlen> ; \strlen
004052BC |. 59 |pop ecx
004052BD |. 03D8 |add ebx, eax
004052BF |. 53 |push ebx
004052C0 |. E8 46EEFFFF |call 0040410B

这个地方0040528E call 0040425E 就是解压的过程,直接f8过了以后eax里面就是你的源代码了。

对于perlapp包含lib的问题,应该在生成文件的时候添加那些附加的库,否则到别的没perl环境的系统上就啥都不显示了。

右键查找script字符串并双击进入cpu窗口

23

下个断点运行到这里,接着F8一步步下去就可以找到flag

22

看了大佬的博客看到他分析的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
$flag = "WMCTF{I_WAnt_dynam1c_F1ag}";
print "please input the flag:";
$line = <STDIN>;
chomp($line);
if($line eq $flag)
{
print "congratulation!"
}
else
{
print "no,wrong"
}

逻辑就是判断一个输入字符串是否等于预先存好的flag的过程