https://monyer.com/game/game1/

第一关

https://monyer.com/game/game1/first.php

java
1
2
3
4
5
6
7
8
9
<script type="text/javascript">
    function check(){
        if(document.getElementById('txt').value=="  "){
            window.location.href="hello.php";
        }else{
            alert("密码错误");
        }
    }
</script>

输入值为俩个空格就可以到下一关了

第二关

https://monyer.com/game/game1/hello.php

java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script type="text/javascript">
    document.oncontextmenu=function(){return false};

    var a,b,c,d,e,f,g;
    a = 3.14;
    b = a * 2;
    c = a + b;
    d = c / b + a;
    e = c - d * b + a;
    f = e + d /c -b * a;
    g = f * e - d + c * b + a;
    a = g * g;
    a = Math.floor(a);

    function check(){
        if(document.getElementById("txt").value==a){
            window.location.href=a + ".php";
        }else{
            alert("密码错误");
            return false;
        }
    }
</script>

需要计算一下 a 的值,

直接在控制台计算就可以了(计算器计算可要费一番功夫了):

第三关

https://monyer.com/game/game1/424178.php

java
1
eval(String.fromCharCode(102,117,110,99,116,105,111,110,32,99,104,101,99,107,40,41,123,13,10,09,118,97,114,32,97,32,61,32,39,100,52,103,39,59,13,10,09,105,102,40,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,39,116,120,116,39,41,46,118,97,108,117,101,61,61,97,41,123,13,10,09,09,119,105,110,100,111,119,46,108,111,99,97,116,105,111,110,46,104,114,101,102,61,97,43,34,46,112,104,112,34,59,13,10,09,125,101,108,115,101,123,13,10,09,09,97,108,101,114,116,40,34,23494,30721,38169,35823,34,41,59,13,10,09,125,13,10,125));

https://www.w3school.com.cn/jsref/jsref_fromcharcode.asp

JavaScript String String.fromCharCode() 方法

定义和用法

<font style="color:crimson;background-color:rgba(222, 222, 222, 0.3);">String.fromCharCode()</font> 方法将 Unicode 值转换为字符。

<font style="color:crimson;background-color:rgba(222, 222, 222, 0.3);">String.fromCharCode()</font> 是 String 对象的静态方法。

语法始终是 <font style="color:crimson;background-color:rgba(222, 222, 222, 0.3);">String.fromCharCode()</font>

您不能使用 myString.fromCharCode()。

实例

如何将 Unicode 值转换为字符:

<font style="color:rgb(0, 0, 0);background-color:rgb(253, 252, 248);">let char = String.fromCharCode(65);</font>

<font style="color:rgb(0, 0, 0);background-color:rgb(253, 252, 248);">let char = String.fromCharCode(72, 69, 76, 76, 79);</font>

语法

String.fromCharCode(n1, n2, …, nX)

控制台解出源码

java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
`function check(){\r\n\tvar a = 'd4g';\r\n\tif(document.getElementById('txt').value==a){\r\n\t\twindow.location.href=a+".php";\r\n\t}else{\r\n\t\talert("密码错误");\r\n\t}\r\n}`

// 完善格式:
function check(){
    var a = 'd4g';
    if(document.getElementById('txt').value==a){
        window.location.href=a+".php";
    }else{
        alert("密码错误");
    }
}

第四关

输入 d4g 之后,会跳转回第三关

那抓包吧:

看看第四关的源码:

java
 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
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="robots" content="noindex,nofollow">
<meta http-equiv="refresh" content="0;url=424178.php">
<title>梦之光芒/Monyer——Monyer's Game(第4关)</title>
<script type="text/javascript">
    eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--)d[c.toString(a)]=k[c]||c.toString(a);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('a="e";d c(){b(9.8(\'7\').6==a){5.4.3=a+".2"}1{0("密码错误")}}',15,15,'alert|else|php|href|location|window|value|txt|getElementById|document||if|check|function|3bhe'.split('|'),0,{}))
</script>
</head>
<body>
<div align="center">
    <p>欢迎您来到第4关</p>
    <p>请输入密码进入第5关
        <input type="text" id="txt" value="">
        <input type="button" onClick="check()" value="提交">
    </p>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"807733ea6abd4b32ab4d336d7b44c27b","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
<script type="text/javascript">
    eval("\141\75\141\56\164\157\125\160\160\145\162\103\141\163\145\50\51\53\61\73");
</script>
</html>

  1. 第一个混淆脚本 直接用控制台解码就可以 了
java
1
2
3
eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--)d[c.toString(a)]=k[c]||c.toString(a);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('a="e";d c(){b(9.8(\'7\').6==a){5.4.3=a+".2"}1{0("密码错误")}}',15,15,'alert|else|php|href|location|window|value|txt|getElementById|document||if|check|function|3bhe'.split('|'),0,{}))
->
3bhe
  1. 第二个混淆脚本
java
1
2
3
4
5
eval("\141\75\141\56\164\157\125\160\160\145\162\103\141\163\145\50\51\53\61\73");
->
a = a.toUpperCase() + 1;

->3BHE1

第五关的密码就是 3BHE1.php

第五关

https://monyer.com/game/game1/3BHE1.php****

第六关

https://monyer.com/game/game1/asdf.php

提示密码在图片中,那应该是涂黑的部分,

那我们在 Google 中搜索这一句明文:

大概就是这个了

密码:seventeen

第七关

https://monyer.com/game/game1/seventeen7.php

MD5 是:eighteen8

提示2:不要被你的所见、经验及习惯蒙蔽了你的双眼,看不到的正是你想要的。

进入之后发现是一个高仿的 404 页面,实际上我们已经到了第八关了

第八关

https://monyer.com/game/game1/eighteen8.php

查看源码:

10000以内所有质数和.php

5736396

python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

total = 0
for i in range(2, 10001):
    if is_prime(i):
        total += i

print(total)

第九关

https://monyer.com/game/game1/5736396.php

记事本打开图片:

MonyerLikeYou_the10level

第十关

在 cookie 中找到 username=simpleuser;
将他修改后发包

doyouknow

第十一关

smartboy

第十二关

base64 解码 && URL 解码:

plain
1
2
3
4
5
6
7
8
9
JTRBJTU0JTYzJTdBJTRBJTU0JTVBJTQ3JTRBJTU0JTU5JTc5JTRBJTU0JTU5JTMxJTRBJTU0JTU5JTc4JTRBJTU0JTYzJTMxJTRBJTU0JTYzJTMwJTRBJTU0JTU5JTM1JTRBJTU0JTU5JTMyJTRBJTU0JTYzJTMxJTRBJTU0JTVBJTQ0JTRBJTU0JTRBJTQ2JTRBJTU0JTYzJTc3JTRBJTU0JTU5JTM0JTRBJTU0JTYzJTc3
->
%4A%54%63%7A%4A%54%5A%47%4A%54%59%79%4A%54%59%31%4A%54%59%78%4A%54%63%31%4A%54%63%30%4A%54%59%35%4A%54%59%32%4A%54%63%31%4A%54%5A%44%4A%54%4A%46%4A%54%63%77%4A%54%59%34%4A%54%63%77
->
JTczJTZGJTYyJTY1JTYxJTc1JTc0JTY5JTY2JTc1JTZDJTJFJTcwJTY4JTcw
->
%73%6F%62%65%61%75%74%69%66%75%6C%2E%70%68%70
-> 
sobeautiful.php

但 sobeautiful.php 并不是十三关

也就是不能直接在 URL 中跳转,

但是可以发现十二关的输入框还没用

这里留了一个 xss 漏洞

<script>alert('xss')</script>

可以用 <a href="sobeautiful.php">111</a>

第十三关

https://monyer.com/game/game1/sobeautiful.php

输入内容抓包:

发现注释中有数据库链接的东西:

关键的 SQL 语句:

plain
1
2
3
4
5
6
7
8
set rss=server.createobject("adodb.recordset")
sqlstr="select password,pwd from [user] where pwd='"&request("pwd")&"'"
rss.open sqlstr,connect,1,1
if rss.bof and rss.eof then
  response.write("密码错误")
else
  response.write(rss("password"))
end if

那就直接用万能密码查找 user 表:' or '1'='1

返回了密码:whatyouneverknow

第十四关

https://monyer.com/game/game1/whatyouneverknow.php****

这里设计到 exe 的逆向:

分析如下:

该图片显示的是使用 Exeinfo PE 工具分析的一个名为 crackme.exe 的可执行文件的详细信息:

主要信息解读:

  • Entry Point (入口点): 0006A410
  • EP Section (入口点节): UPX1
    → 说明入口点在被UPX压缩后的首个节,基本可以判定该文件已用UPX壳保护/压缩过。
  • File Offset (文件偏移): 00026810
  • First Bytes (文件前几个字节): 60 BE 00 40 44
  • Linker Info (链接器版本): 2.25
  • SubSystem (子系统): Windows GUI
    → 表示此可执行文件为标准的Windows图形界面应用。
  • File Size (文件大小): 00027A00h (即约160KB)
  • Overlay (文件叠加): NO 00000000
    → 无附加数据或隐藏数据流。
  • Image is 32bit executable
    → 32位可执行文件。
  • RES/OVL : 2 / 0 %
    → 有2个资源,0重叠/无覆盖数据。
  • 年份: 1992(PE格式标志,可能为默认值��

UPX相关信息:

  • 检测到UPX壳,具体版本区间:UPX 0.89 - 4.0x (此文件实际匹配UPX 2.02特征)。
  • 工具提示如何脱壳:
plain
1
unpack 'upx.exe -d' from http://upx.github.io or any other tool

意味着可通过UPX工具自身使用 upx.exe -d crackme.exe 命令进行“脱壳”操作,将文件还原回未压缩状态,便于进一步静态分析或逆向工程。

总结建议

  • 文件已被UPX压缩,分析或逆向需先脱壳(可用upx命令行工具)。
  • 脱壳后可以用IDA Pro, x32dbg等工具继续深入分析其行为。
  • 文件无叠加数据、无.NET标记,是常规PE结构。

UPX 脱壳:

主要信息

  • 文件名:crackme.exe
  • 入口点 (Entry Point):00053B08(程序入口地址)
  • 入口节 (EP Section):CODE(说明程序入口现在在标准的代码节里)
  • 文件偏移 (File Offset):00052F08
  • 首字节 (First Bytes):55 8B EC 83 C4
    这是典型的x86汇编函数开头,说明为标准未加壳代码。
  • Linker Info:2.25
  • 子系统 (SubSystem):Windows GUI(窗口图形界面程序)
  • 文件大小 (File Size):00061C00h(约398,336字节)
  • Overlay:NO 00000000(无附加数据块或文件流)
  • 位数:32位可执行程序
  • 资源数量 (RES/OVL):5个资源 / 0重叠
  • 年份:1992(PE格式标识,通常不变)

“9eeee9eb50eff979”

密码:ipasscrackme.asp

隔得时间长了就得回去重做 O(∩_∩)O

但是我的不行。。