Hackergame 2019

WEB

签到题

题目

签到题就在这里~

解决方案

F12检查页面源代码。

发现 button 的 disabled 属性被设置为 disabled。删去该属性。

输入token,获得flag。

信息安全 2077

题目

2077 年很快到来了。此时正值祖国 128 周年华诞,中国科学技术大学也因其王牌专业信息安全,走出国门,成为了世界一流大学。作为向信息安全专业输送人才的重要渠道,第 64 届信息安全大赛也正在如火如荼地开展着。

千里之行,始于足下。作为一名渴望进入信息安全专业的学生,你的第一个任务是拿到第 64 届信息安全大赛的签到题的 flag。我们已经为你找到了签到题的入口,你只需要把 flag.txt 的内容读出来就可以了。

注:为了照顾到使用黑曜石浏览器的用户,第 64 届信息安全大赛的签到题决定沿袭之前 63 届信息安全大赛的惯例,仍然基于 HTTP 1.x。当然了,使用其他浏览器也是可以顺利完成任务的。

解决方案

打开题目链接。

大概是你还要等21165天后才能获得 flag。

于是我们等了21165天,终于获得了 flag (等等,好像有点不对…?)

方法一:

先查看网页源代码。

发现是在前端获得时间 now 并发送…如果到达时间就返回flag。

并且要修改的值为 If-Unmodified-Since,注意到 date 的方式。

随手开了 IDEA,找了一个2078年的日期调用 toUTCString() 函数。

得到结果

开启 burp,刷新 firefox 页面。

啊…找到了 If-Unmodified-Since,偷梁换柱一下,把日期修改为刚刚获得的日期。

继续 forword。

flag 到手。

方法二:
curl 202.38.93.241:2077/flag.txt -H "User-agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) HEICORE/49.1.2623.213 Safari/537.36" -H "If-Unmodified-Since: Tue, 15 Oct 2077 05:47:08 GMT" -d

达拉崩吧大冒险

题目

某一天,C 同学做了一个神奇的梦。在梦中,他来到了蒙达鲁克硫斯伯古比奇巴勒城……

解决方案

整数溢出:

https://wiki.x10sec.org/pwn/integeroverflow/intof/

找到 click 函数,在 get v 后打断点,修改 v 数据 。

-2^60 次方可以正常购买, -2^61 次方则会造成异常 。

网页读取器

题目

今年,刚刚学会网络编程的小 T 花了一点时间,写了一个非常简单的网站:输入一个 URL,返回对应的内容。

不过小 T 想对用户访问的站点进行一些限制,所以他决定自己来解析 URL,阻止不满足要求的请求。这样也顺便解决了 SSRF(Server-Side Request Forgery, 服务器端请求伪造)的问题。

想象很美好,但小 T 真的彻底解决了问题吗?

解决方案

下载源代码。

from flask import Flask, render_template, request, send_from_directory
import requests
# well, requests is designed for humans, and I like it.
app = Flask(__name__)
whitelist_hostname = ["example.com",
"www.example.com"]
whitelist_scheme = ["http://"]
def check_hostname(url):
for i in whitelist_scheme:
if url.startswith(i):
url = url[len(i):] # strip scheme
url = url[url.find("@") + 1:] # strip userinfo
if not url.find("/") == -1:
url = url[:url.find("/")] # strip parts after authority
if not url.find(":") == -1:
url = url[:url.find(":")] # strip port
if url not in whitelist_hostname:
return (False, "hostname {} not in whitelist".format(url))
return (True, "ok")
return (False, "scheme not in whitelist, only {} allowed".format(whitelist_scheme))
@app.route("/")
def index():
return render_template("index.html")
@app.route("/request")
def req_route():
url = request.args.get('url')
status, msg = check_hostname(url)
if status is False:
# print(msg)
return msg
try:
r = requests.get(url, timeout=2)
if not r.status_code == 200:
return "We tried accessing your url, but it does not return HTTP 200. Instead, it returns {}.".format(r.status_code)
return r.text
except requests.Timeout:
return "We tried our best, but it just timeout."
except requests.RequestException:
return "While accessing your url, an exception occurred. There may be a problem with your url."
@app.route("/source")
def get_source():
return send_from_directory("/static/", "app.py", as_attachment=True)
if __name__ == '__main__':
app.run("0.0.0.0", 8000, debug=False)

可以注意到白名单 whitelist_hostname 有题目所给的两个样例。

URI 的语法(摘自官方题解)

scheme:[//authority]path[?query][#fragment]

其中用 [] 围住的是可选的。然后我们来看一下各部分:

  • 协议 (scheme):访问资源使用的协议,比如说 http, https 之类的。
  • 来源 (authority):来源中包含了主机名,和可选的用户信息和端口号,比如 www.ustc.edu.cn, admin:admin@www.example.com:2333(使用用户名为 admin,密码为 admin,访问 www.example.com 的 2333 端口获取资源)。
  • 路径 (path):比如说 /cgi-bin, /a/b/c/d/e/f/g 等,有等级 (hierarchical) 关系。
  • 查询 (query):没有等级 (non-hierarchical) 关系的数据。一般来说,查询中的参数会被网站的后端获取到,然后进行对应的处理,比如 ?q=keyword,?a=1&b=2。
  • 片段 (fragment):指向一个更低级别的资源,例如 #Examples,浏览器访问时会滚动到 id 为 Examples 的标签。如果写过单页面应用 (SPA) 的同学可能会知道,一些框架处理路由时使用 hash 模式,这里的 hash 就是片段开头的 #。

让 check_hostname 解释出主机名为 example.com 的同时,让 requests.get() 实际访问我们想要的地址。

http://web1/flag#@example.com

检验时忽略掉了@前的所有内容,但实际上访问的是http://web1/flag

输入后获得flag。

GENERAL

白与夜

题目

这是一个关于白猫,嗯不对,关于黑猫的故事。

解决方案

方法一:

打开网页的 Sources,新窗口打开cat.png,得到flag。

方法二:

网安培训上知道了stegsolve这个东西…就拿stegslove试了一下。

下载cat.png,用stegsolve打开,切换到flagg清晰为止。

Happy LUG

题目

在今年信安大赛命题组的内部聊天记录中,出现次数最多的 emoji 是什么?

答案是:「😂」(喜极而泣的表情,Face with Tears of Joy)。这是大家最喜欢使用的 emoji 之一。

或许是因为这个原因,最近几天,命题组某位同学收到了一张神秘的字条:

看起来是一个域名,但里面怎么会有 😂 这个 emoji?而且,虽然浏览器访问不了,但这个域名确实是存在着的。

你能解开其中隐藏着的信息吗?

解决方案

  • Unicode 域名编码方案 Punycode,😂会被编码成 xn--g28h,这一点从后台提交记录也看得到,好多人提交了包含 xn--g28h 的字符串(估计是浏览器替他们展开的,其实如果你用一些浏览器例如 Google Chrome 尝试访问这个域名也能看到 Punycode 的编码)。
  • 这个域名无法通过浏览器访问,也就是这个域名没有指向任何 IP 地址。实际上一个域名除了可以指向一个或多个 IP 地址(A 或 AAAA 记录)之外还可以包含其他信息,例如指向另一个域名(CNAME 记录),指示接收邮件的服务器(MX 记录),或者提供任意字符串(TXT 记录)。
  • 查询 DNS 记录有很多种方式,例如网上搜一个查询服务(似乎很多人是这么干的)或者使用 nslookup 等命令行工具,总之查出这个 TXT 记录就对了。

https://mxtoolbox.com/SuperTool.aspx?action=txt%3a%F0%9F%98%82.hack.ustclug.org&run=toolpage#

正则验证器

问题

小 F 是一位狂热的正则表达式爱好者。今天,他写了一个在线的正则验证服务:服务器会运行你的正则,返回匹配结果。

小 F 还说,如果有人能卡住服务器(运行时间超过 1 秒),他就会送出自己的 flag。

当然,为了避免太容易拿到 flag,小 F 限制了正则和字符串的长度,具体内容请查看源代码。

你可以通过 nc 202.38.93.241 10006 命令来连接题目,或者使用我们提供的网页终端

如果你不知道 nc 是什么,或者在使用上面的命令时遇到了困难,可以参考我们编写的 萌新入门手册:如何使用 nc/ncat?

解决方案

https://juejin.im/entry/59f7f41ef265da4322407f37

ubuntu运行,利用正则回溯。

MATH

42

题目

天何所杳, 十二焉分?

日月安属, 列星安陈?

浩瀚宇宙的一个寻常星系里, 弥漫六合的暗物质晕中, 远古的诗歌在狄拉克海上无声回荡.

史诗般的超级计算机 Deep Thought, 寒冷星空下的百万亿场效应管, 人类终得以一窥这个宇宙最深层的奥秘.

没错, 就是 42, 对于生命, 对于宇宙, 对于世间万物的答案.

你可以通过 nc 202.38.93.241 10017 命令来连接题目,或者使用我们提供的网页终端

如果你不知道 nc 是什么,或者在使用上面的命令时遇到了困难,可以参考我们编写的 萌新入门手册:如何使用 nc/ncat?

解决方案

ubuntu子系统运行。

$ nc 202.38.93.241 10017

输入token。

要求算出 x ^ 3 + y ^ 3 + z ^ 3 = 42。

于是建造了超巨型计算机,算出了值。

让我友好的google一下。

https://interestingengineering.com/the-sum-of-three-cubes-problem-for-42-has-just-been-solved

输入,OK,完事。

BINARY

小巧玲珑的 ELF

问题

HR 问眼前的年轻人:“你说你会编程?”

年轻人回答道:“是的,我会用 C 编程。”

HR 很是不屑的看着年轻人问:“C 语言是基础,很多人都会 C 语言,我来考考你,你来说一说你常用的 C 语言头文件。”

年轻人:“stdiostdlibstdint等等,这些我都很熟悉的,这些库里面的函数我也用的很 6。”

HR笑着问年轻人:“哼哼哼,用库函数看不出水平,你能不用系统库函数实现功能吗?”

年轻人心中一惊,不用库函数怎么编程?年轻人正想着,HR 给了他一个文件对他说:“把它研究明白,再来找我吧!”

解决方案

# 动态调试

linux_serverlinux_server64 以及题目文件 tinyELF 移到 ubuntu 虚拟机文件夹下。

file tinyELF查看文件位数。

./linux_server64

sudo chmod +x tinyELF添加权限。

ifconfig查看IP地址。

IDA设置

工具栏:改为Remote Linux debuger。

Debug application setup:

然后运行。

debug

给 v0 处打断点,通过F8观察内存栈变化。

运行完所有赋值语句后:

要求输入flag。

字符串通过一系列变化:

要等于输入栈内的数值(即刚开始的0-45v的赋值)。

根据验证的内容倒推

(来自某位不知名的dalao)

#include <iostream>
​
int main() {
int array[] = {102, 110, 101, 107, -125, 78, 109, 116, -123, 122, 111, 87, -111, 115, -112, 79, -115, 127, 99, 54, 108,
110, -121, 105, -93, 111, 88, 115, 102, 86, -109, -97, 105, 112, 56, 118, 113, 120, 111, 99, -60, -126,
-124, -66, -69, -51};
for (int i = 0; i < 46; ++i) {
array[i] += i;
array[i] ^= i;
array[i] -= 2 * i;
std::cout << (char)array[i];
}
return 0;
}

得到flag。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇