[TOC]
我和ChatGPT(3.5)合砍4200分!ChatGPT让0基础打CTF成为可能!
HG真是时间黑洞,感觉像玩游戏一样,实时排行榜pvp也很激动。
尝试念出Hackergame 启动,匹配度不够,阅读去年签到题解。
观察地址栏并修改URL可解。
-
想要借阅世界图书出版公司出版的《A Classical Introduction To Modern Number Theory 2nd ed.》,应当前往中国科学技术大学西区图书馆的哪一层?(30 分)
12
-
今年 arXiv 网站的天体物理版块上有人发表了一篇关于「可观测宇宙中的鸡的密度上限」的论文,请问论文中作者计算出的鸡密度函数的上限为 10 的多少次方每立方秒差距?(30 分)
23
-
为了支持 TCP BBR 拥塞控制算法,在编译 Linux 内核时应该配置好哪一条内核选项?(20 分)
提示:输入格式为 CONFIG_XXXXX,如 CONFIG_SCHED_SMT。
CONFIG_TCP_CONG_BBR
问ChatGPT可解
-
🥒🥒🥒:「我……从没觉得写类型标注有意思过」。在一篇论文中,作者给出了能够让 Python 的类型检查器
MyPYmypy 陷入死循环的代码,并证明 Python 的类型检查和停机问题一样困难。请问这篇论文发表在今年的哪个学术会议上?(20 分) 提示:会议的大写英文简称,比如 ISCA、CCS、ICML。ECOOP
问ChatGPT这篇论文可能发表在哪个学术会议上,ChatGPT说相关研究可能发表在计算机科学、编程语言、静态分析等领域的学术会议上,如OOPSLA、PLDI、POPL等。
追问编程语言、静态分析等领域的知名学术会议有哪些,在ChatGPT给的答案中爆破。
浏览器按F12, 0.5s后flag出现在html代码中
这题真的太有意思了,0基础第一次做这样的题。
除了第一张图上的奖牌获得者人名外,题目的4张图唯一清晰可见的文字信息可能来自于第2张图学长的袋子。
STATPHYS28,搜索发现是今年在东京大学举办的学术会议。
范围大的话考虑整个今年暑假,通过STATPHYS28可以迅速缩小范围,找到2023-08-10
搜索图1人名可知学校是东京大学,奖牌是诺贝尔物理学奖,与STATPHYS28举办地吻合,双重保障!
然后查看诺贝尔物理学奖历届得主发现好像东京大学出生最晚的获奖者是2015 年获奖的Takaaki Kajita,他在东京大学宇宙射线研究所工作。
搜索可知缩写为ICRR
先猜一手博物馆是东京国立博物馆,在地图上可以看到博物馆距离东京大学和上野站不远。
通过地图搜索确定喷泉是上野公园,Google搜索上野公园2023 August,查找可能的活动,确定活动名称后再搜索活动名称+志愿者,最终搜索到包含志愿者招募链接的网页。
[ボランティアSTAFF大募集!!第6回「全国梅酒まつりin東京2023」|全国梅酒まつり (umeshu-matsuri.jp)](https://prtimes.jp/main/html/rd/p/000000035.000021306.html)
在东京国立博物馆查到门票1000日元,学生票500,发现都不对?心想该不会学长能免票吧输个0看看,竟然对了!
0
通过STATPHYS28主页可以了解日程并锁定英文的集合地点名,搜索发现有2种翻译,安田礼堂和安田讲堂,最终是安田讲堂
安田讲堂
一开始搜索引擎死活搜不出有效信息,后面去社交媒体搜索一下子就看到了粉色熊猫海报。
然后一直没理解出站口是哪,一开始以为上野出站口,折腾半天发现上野出站口没3D广告,然后搜索东京3D广告,发现了三花猫,也不对,然后以为马里奥是大阪的主题公园,搜索大阪3D广告找到了秋田犬。
日本大阪3D广告牌秋田犬呆萌逗趣|日本大阪_新浪财经_新浪网 (sina.com.cn)
结果这题是任天堂附近的东京涩谷出站口的3D广告,也是秋田犬……误打误撞
熊猫-秋田犬
F12修改监视变量可解
搜索引擎学习
admin@DESKTOP-RJ8J56I MINGW64 /e/USTC/Hackergame/ML-Course-Notes (main)
$ git reflog
ea49f0c (HEAD -> main) HEAD@{0}: commit: Trim trailing spaces
15fd0a1 (origin/main, origin/HEAD) HEAD@{1}: reset: moving to HEAD~
505e1a3 HEAD@{2}: commit: Trim trailing spaces
15fd0a1 (origin/main, origin/HEAD) HEAD@{3}: clone: from https://github.com/dair-ai/ML-Course-Notes.git
admin@DESKTOP-RJ8J56I MINGW64 /e/USTC/Hackergame/ML-Course-Notes (main)
$ git show 15fd0a1 HEAD@{2}
commit 15fd0a13eb46c39f34cfc0dfb4757ad23a23d026 (origin/main, origin/HEAD)
Author: Elvis Saravia <[email protected]>
Date: Sun Feb 12 21:38:54 2023 -0600
Update README.md
diff --git a/README.md b/README.md
index 93874da..8f13fd4 100644
--- a/README.md
+++ b/README.md
@@ -89,20 +89,6 @@ A place to collaborate and share lecture notes on all topics related to machine
<td class="tg-yw4l"><a href="https://dair-ai.notion.site/Lecture-5-Deep-Reinforcement-Learning-8ecc8b16a5ad4fcc81b5c3ceb21608b5">Notes</a></td>
<td class="tg-yw4l"><a href="https://twitter.com/omarsar0">Elvis<a></td>
</tr>
- <tr>
- <td class="tg-yw4l">Limitations and New Frontiers</td>
- <td class="tg-yw4l">Limitations and New Frontiers in Deep Learning.</td>
- <td class="tg-yw4l"><a href="https://youtu.be/wySXLRTxAGQ">Video<a></td>
- <td class="tg-yw4l">WIP</td>
- <td class="tg-yw4l"><a href="https://twitter.com/omarsar0">Elvis<a></td>
- </tr>
- <tr>
- <td class="tg-yw4l">Autonomous Driving with LiDAR</td>
- <td class="tg-yw4l">Autonomous Driving with LiDAR.</td>
- <td class="tg-yw4l"><a href="https://youtu.be/NHZMfSMAHlo">Video<a></td>
- <td class="tg-yw4l">WIP</td>
- <td class="tg-yw4l"><a href="https://twitter.com/omarsar0">Elvis<a></td>
- </tr>
</table>
commit 505e1a3f446c23f31807a117e860f57cb5b5bb79
Author: some_english_postgraduate <[email protected]>
Date: Thu Oct 26 15:57:40 2023 +0800
Trim trailing spaces
diff --git a/README.md b/README.md
index 8f13fd4..f629dae 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ A place to collaborate and share lecture notes on all topics related to machine
---
-### Machine Learning Specialization (2022)
+### Machine Learning Specialization (2022)
[Website](https://www.coursera.org/specializations/machine-learning-introduction) | Instructor: Andrew Ng
<table class="tg">
@@ -16,7 +16,7 @@ A place to collaborate and share lecture notes on all topics related to machine
<th class="tg-yw4l"><b>Notes</b></th>
<th class="tg-yw4l"><b>Author</b></th>
</tr>
-
+ <!-- flag{TheRe5_@lwAy5_a_R3GreT_pi1l_1n_G1t} -->
<tr>
<td class="tg-yw4l">Introduction to Machine Learning</td>
<td class="tg-yw4l">Supervised Machine Learning: Regression and Classification</td>
@@ -42,7 +42,7 @@ A place to collaborate and share lecture notes on all topics related to machine
---
反复尝试:
the girl ask the man "am i smart, not very ?"
The man smiled and said, "Yes, you are smart. You can do it!"
The girl was so happy and she thanked
👏👏👏 flag1: flag{i-7H!NK-y0U-ARe-re4l!y-ReA1!Y-$M4rT} 👏👏👏
先是发现
accept request
可以出,但是超出了字符限制
然后尝试了accept加各种字符,就是没试
accept*
也试了暴力破解,但没跑出来orz
随便找个在线压缩网站压缩下就成了,然后就不会了
有点麻烦,F12阅读js代码后发现必须对需要撤回的消息执行revoke函数,于是学习如何修改js代码并在ChatGPT帮助下自己写代码后终于搞定
核心代码部分,完整代码见code\321.0616682d.js
created() {
const myArray = [];
const e = new URLSearchParams(window.location.search);
Bt.get("/api/checkToken", {
params: e
}).then((()=>{
window.history.replaceState({}, "", "/"),
Bt.post("/api/getMessages").then((e=>{
const t = e.data
, r = t.messages;
console.log(r);
this.count = r.length;
for (const [idx,n] of r.entries()){
this.timers.push(setTimeout((()=>{
if (n.text.match(/hack\[([a-z]+)\]/)) {//如果匹配为需要撤回的消息
myArray.push(n)
console.log("set",idx)
this.revoke1(idx)//利用魔改的撤回函数执行撤回
};
this.messages.push({
name: this.randomString(),
message: n.text,
type: "NormalMessage"
}),
this.count = this.count - 1,
this.$nextTick((()=>{
this.fakeContainerElement || (this.fakeContainerElement = document.querySelector(".fakeqq-container"),
this.fakeContainerElement && (this.fakeContainerElement.onscroll = ()=>{
const e = this.fakeContainerElement?.offsetHeight ?? 0
, t = this.fakeContainerElement?.scrollHeight ?? 0
, r = this.fakeContainerElement?.scrollTop ?? 0;
this.stopScroll = !(e + r >= t - 10)
}
)),
this.stopScroll || (this.currentScrollHeight = this.fakeContainerElement?.scrollHeight ?? 0,
this.fakeContainerElement?.scrollTo(0, this.currentScrollHeight))
}
))
}
), 1e3 * n.delay))
}
this.timers.push(setTimeout((()=>{
Bt.post("/api/getflag").then((e=>{
const t = e.data;
// t.success ? alert("获取 flag 失败,原因:" + t.error) : alert("恭喜你,flag 是:" + t.flag) 一开始发现这样不行,必须正确撤回消息
t.success ? alert("恭喜你,flag 是:" + t.flag) : alert("获取 flag 失败,原因:" + t.error)
}
)).catch((()=>{
alert("网络错误,请刷新页面重新开始1")
}
))
}
), 1e3 * r[r.length - 1].delay + 5e3))
}
)).catch((()=>{
alert("网络错误,请刷新页面重新开始2")
}
))
}
)).catch((()=>{
window.location.href = "/api/checkToken"
}
))
for (const n of myArray){
console.log(n)
}
},
beforeUnmount() {
if (this.timers)
for (const e of this.timers)
clearTimeout(e)
},
methods: {
revoke(e) {
this.messages[e].message = "正在撤回...",
this.messages[e].type = "ToastMessage",
Bt.post("/api/deleteMessage", {
id: e
}).then((t=>{
const r = t.data;
r.success ? this.messages[e].message = "你撤回了一条消息" : this.messages[e].message = `撤回失败(${r.error})`
}
)).catch((()=>{
alert("网络错误,请刷新页面重新开始4")
}
))
},
revoke1(e) {//魔改的撤回函数,删除了对this.messages的处理,只执行Bt.post
Bt.post("/api/deleteMessage", {
id: e
}).then((t=>{
const r = t.data;
r.success ? console.log("ok"): console.log("noo!")
}
)).catch((()=>{
alert("网络错误,请刷新页面重新开始4")
}
))
},
磨人,特别是1.2,我的ChatGPT在这题里始终没帮到我,也可能是提示词不对。
搜索引擎查找后1.1容易解,特别是搜小题标题, json is not subset of yaml 1.1
发现典型的解就是带e的数字表示,例如0e0,除此以外还发现NaN也可以,虽然Json文档说不行
看了Json文档和YAML 1.2文档都搞不出来,搞出了好几个json可以但yaml1.1会崩溃的,突然某天晚上随手一试重复键名就出了……
JSON 标准 ECMA-404_json标准-CSDN博客
{"num": -0.0e0 , "num": -0.00}
{"n":1,"n":0e0}
一开始看代码没搞懂,后面上课时对着代码手推搞明白了
关键在于cod_dict长度应该是24,但惜字如金化后的代码里只有23个字符,但是通过代码最后对 'flag{' 和 '}' 的校验可以提示到,可以利用确定的这部分结果反推可能的惜字如金化字符范围,反推后就是上图绿色的部分。
最后其中一种可以正确得到结果的代码
#!/usr/bin/python3
# Th siz of th fil may reduc after XZRJification
def check_equals(left, right):
# check whether left == right or not
if left != right: exit(1)
def get_cod_dict():
# prepar th cod dict
cod_dict = []
cod_dict += ['nymeh1niwemflcir}echaete']
cod_dict += ['a3g7}kidgojernoetlsup?he']
cod_dict += ['ullw!f5soadrhwnrsnstnoeq']
cod_dict += ['cct{l-findiehaai{oveatas']
cod_dict += ['tty9kxborszstguyd?!blm-p']
check_equals(set(len(s) for s in cod_dict), {24})
return ''.join(cod_dict)
def decrypt_data(input_codes):
# retriev th decrypted data
cod_dict = get_cod_dict()
output_chars = [cod_dict[c] for c in input_codes]
return ''.join(output_chars)
if __name__ == '__main__':
# check som obvious things
check_equals('create', 'cre' + 'ate')
check_equals('referrer', 'refer' + 'rer')
# check th flag
flag = decrypt_data([53, 41, 85, 109, 75, 1, 33, 48, 77, 90,
17, 118, 36, 25, 13, 89, 90, 3, 63, 25,
31, 77, 27, 60, 3, 118, 24, 62, 54, 61,
25, 63, 77, 36, 5, 32, 60, 67, 113, 28])
check_equals(flag.index('flag{'), 0)
check_equals(flag.index('}'), len(flag) - 1)
# print th flag
print(flag)
我的最终结果:
你目前收集到了 12 个状态码:[100, 200, 206, 304, 400, 404, 405, 412, 413, 414, 416, 505]
听说有13个,我这12个部分乱推的没了。后面大部分是对照着MDN的状态码大全,问ChatGPT你能不能构造一个xxx状态码的请求,我批判性地去尝试(
试出来的,后面发现好像GET也行
TRACE /\r\n\r\n
GET / HTTP/1.1\r\n
Host: example.com\r\n
Range: bytes=1000-2000\r\n\r\n
GET / HTTP/1.1\r\n
Host: example.com\r\n
If-Match: 666\r\n\r\n
GET / HTTP/1.1\r\n
Host: example.com\r\n
Range: bytes=0-499\r\n\r\n
GET / HTTP/1.1\r\n
Host: example.com\r\n
If-None-Match: "64dbafc8-267"\r\n\r\n
这个卡住我了,当时ChatGPT给了一个GET /long-url 之类的写法,我略微增长后发现不行就跳过了。
后面看某个文档才发现GET URL的长度要超过2048个字符才能触发服务器返回414状态,于是我疯狂复制粘贴延长URL
GET /??????????????v这里有超过2048个字符v2=2,v333================3 HTTP/1.1\r\n
Host: example.com\r\n\r\n
居然有我能比较轻松解出的题目!以前上操作系统实验要用docker挂载目录,于是无需别人提示我就想到挂载目录是否可行,果然可以!
alpine:/$ ls -l /flag
lrwxrwxrwx 1 root root 13 Oct 8 12:10 /flag -> /dev/shm/flag
alpine:/$ cd dev/shm/flag
-ash: cd: can't cd to dev/shm/flag: Not a directory
alpine:/$ cd dev
alpine:/dev$ ls
block sr0 tty30 tty57
bsg stderr tty31 tty58
cdrom stdin tty32 tty59
console stdout tty33 tty6
cpu_dma_latency tty tty34 tty60
disk tty0 tty35 tty61
fd tty1 tty36 tty62
full tty10 tty37 tty63
kmsg tty11 tty38 tty7
loop tty12 tty39 tty8
loop-control tty13 tty4 tty9
loop0 tty14 tty40 ttyS0
loop1 tty15 tty41 ttyS1
loop2 tty16 tty42 ttyS2
loop3 tty17 tty43 ttyS3
loop4 tty18 tty44 urandom
loop5 tty19 tty45 vcs
loop6 tty2 tty46 vcs1
loop7 tty20 tty47 vcsa
mem tty21 tty48 vcsa1
mqueue tty22 tty49 vcsu
null tty23 tty5 vcsu1
port tty24 tty50 vda
ptmx tty25 tty51 vda1
pts tty26 tty52 vda2
random tty27 tty53 vda3
root tty28 tty54 vdb
rtc0 tty29 tty55 zero
shm tty3 tty56
alpine:/dev$ cd shm
alpine:/dev/shm$ ls
flag
alpine:/dev/shm$ flag
-ash: flag: not found
alpine:/dev/shm$ docker run -v /dev/shm:/shm -it alpine
/ # ls
bin etc lib mnt proc run shm sys usr
dev home media opt root sbin srv tmp var
/ # cd shm
/shm # ls
flag
/shm # flag
/bin/sh: flag: not found
/shm # cat flag
flag{u5e_r00t1ess_conta1ner_53424ec4b9_plz!}
alpine:/dev/shm$ cat flag
cat: can't open 'flag': Permission denied
一开始卡住了,0基础没见过,CTF-wiki的音频隐写没教这个,好在某天中午还是搜到了疑似的信息,进一步搜索后发现了这玩意能空间站,和题目对上了,没错,就是MMSV!
我是通过下面这个视频0基础学习的。
https://www.bilibili.com/video/BV1LE411v7BL
看到图像一步步出现,非常激动人心!
一开始没理解对,谷歌亲儿子是Pixel,我以为是什么像素,藏在像素里,然后卡住,同样搜了各种CTF 图像MISC都搞不定。
非常值得一提的是,在我自行摸索的过程种,我确实觉得答案应该就是这个图片下面还有一截被截掉了,而且当我使用截图工具对图像截掉一小点后,会发现文件几乎小了1半(这个BUG是不是一开始就这么被发现的?),但当我照着传统的misc教学里用脚本测试图片宽高,会发现没有问题orz
某天中午bing搜索 png misc pixel 截图 连系统都没心思升级,发现一篇知乎文章
打过码的图片等于没打,用Windows的要小心了 - 差评的文章 - 知乎 https://zhuanlan.zhihu.com/p/619038753
然后就是这个网站acropalypse ,选择Pixel 7
看到图像出现,有点生气,就这卡了我好几天!
用asciinema工具(LInux)下,cat输出到文件,然后发现有一堆乱码,查询发现是控制字符。
然后我就被卡住了,研究了好几天如何输出不带控制字符的文件,都没研究出来。
某天心一横,直接Ctrl+H替换,发现乱码替换就行,我真傻
完整代码见code\flag.js
进入游戏,开启建筑状态显示,出了按钮点点其他建筑,发现每组按钮都有一个写控制的建筑,进去看逻辑。
第一组
打开逻辑对应的开关
10100101
第二组
研究发现逻辑是是i^2,i不超过15,同时第1个和第6个确定是1
于是196 == 11000100 == 13^2
11000100
第四组,逻辑对应开关,但不理解,于是尝试,发现好像是得给冲击发动机这一路供电,尝试后
01110111能供电
第三组,最麻烦,动不动钍反应堆就炸了,既要看逻辑,也要看建筑是什么功能
资源都打开,泄露管不能开
熔毁消耗冷却液,不能开
钍反应堆最后开
10001100
终于对了
10100101110001001000110001110111
ChatGPT写脚本,反复尝试宽高组合,有的只能看到乱的条纹
搜索常见视频宽高,发现了一个宽854
宽854->427
高240-360-854-754774-763-759
最后执行脚本,视频非常清晰
看别人的好像有人用条纹估算宽高,有人质因数分解……
代码见code\recover.py
ChatGPT立大功,先把stage1/lib.c
丢给它问这是啥,它说
这段代码是一个C语言程序,它使用了Linux的动态链接库劫持(LD_PRELOAD技术),通过重定义标准库函数的方式,来修改特定文件操作函数的行为,使它们在处理文件名中包含"flag"的情况下,返回一个伪造的文件名"/fakeflag",而不是真实的文件名。
于是我学会了一个词叫做 Linux的动态链接库劫持(虽然好像小标题里也有)
然后我就开始尝试不被劫持,让ChatGPT不要用fopen吧啦吧啦,然后它给了好多解决方案,但是都被劫持了……
结果最后我直接问
以下代码使用Linux动态链接劫持了一系列标准库函数 你需要写一个c代码,绕过被劫持的函数,输出file-name文件的内容
它直接给了用动态库加载函数dlsym的正确方法代码,泪目,好像这个函数没有被劫持
代码见code\dlsym.c
卡了很久很久?最后30min做出了前2问,用的拆分包的方法!激动人心!
我的搜索能力还是太弱了,就没搜到这种方法,还是靠依稀的计网记忆想的。
其实在探索时,ChatGPT已经提过可能的手段,但当时我忽略了
分片数据包:HTTP请求可以被分割成多个TCP数据包进行传输,特别是对于大型请求。如果字符串"POST"被分割成不同的数据包,规则可能不会同时匹配这些数据包,从而导致规则不起作用。
编码:HTTP请求可以使用不同的编码方式进行传输,如chunked编码。在这种情况下,字符串"POST"可能以不同的方式编码,从而不会以明文形式出现在数据包中。
ChatGPT还经常拒绝配合获取flag的行动,通常把flag换成tag它就配合了。
最后当我坚持让ChatGPT用socket写一个拆分tcp包的http请求,很快就收到了invalid token的提示,说明绕过规则成功。
然后我改了token得到flag,发现答案错误?!我发现还能得到第2问flag,也答案错误?!
最后发现,不知怎的,这个flag服务器获取到不完整的token也能生成flag而不是提示invalid token
改正代码后可解
详细代码见code\chunk.py