萌新的第一次hgame开始了。week1的难度比较友好,至少从web上来说是这样的,自己目标也不高,争取做到每个week能akweb就满足了。这次的web整体上比较简单,除了我自己被坑到的codeworld(中间居然被ban了ip,我只是用脚本post了一次 ,没拿扫描器扫啊啊啊)剩下的3题加起来基本1小时以内就能做完hh。除此之外还试了试密码学跟misc的简单题,也都写一写过程吧。(另外体会到re,pwn真的是爸爸,爷爷,排名高的基本都是二进制的……,我什么时候才能学会二进制啊)
看到官方发布了才发的,那就贴下官方的:https://github.com/vidar-team/Hgame2020_writeup
WEB
Cosmos 的博客
显然提示的是源码泄露。那么就果断GitHack走起。可是拿下来的结果只有index.html与css文件。这时候一开始我陷入了错误的想法,具体参考原来ichunqiu上做过的‘登陆’一题。于是我使用了能够回滚的githack,在它爬下的objects里一个个找(具体方法如下)
git cat-file -p /两位数/文件名
查看完所有objects也没有什么收获,除了出题人的github……那么是否是历史回滚呢?但用git找却只找到一个版本,感觉不太对劲。那就上github上找找吧……结果还真有。
下面的版本中就有flag的base64编码
接头霸王
题目上来没啥提示,除了一张接头霸王的图片跟you need to come from vidar.club
要说web里跟头有关的,那只能是抓包里常见的Header了。加上come from 某个网址,不难知道就是http Header中referer这个属性。这个属性之所以有名,跟它将错就错的拼写有关,正确拼写显然是referrer,而这个错误拼写是早期规范的错误因为向后兼容遗留至今的。其作用是告诉服务器我们访问者是从哪链接过来的,从而进行区别处理。
那么先加referer头
提示要从本地访问,那就更熟悉不过了,因为这用到已经烂熟于心的XFF头了。常常用于伪造ip。所以我们令XFF头为127.0.0.1.
提示改浏览器,那只需改User-Agent 头,加上cosmos即可。
flag要在2077后更新?一看到2077我就想到去年新手上场的中科大hackergame里的信息安全2077,那道题就是通过改header中一个属性来拿flag。这道题应该也一样吧……那么我们要改什么属性呢?先来看看response:
注意到有Last-Moified这一属性,而requests的请求头中与之对应的就是If-Unmodifed-Since,其官方解释
HTTP协议中的
If-Unmodified-Since
消息头用于请求之中,使得当前请求成为条件式请求:只有当资源在指定的时间之后没有进行过修改的情况下,服务器才会返回请求的资源,或是接受POST
或其他 non-safe 方法的请求。如果所请求的资源在指定的时间之后发生了修改,那么会返回412
(Precondition Failed) 错误。
所以改好时间在2077之后:
code world
这道题做出来的人数算是所有web里面最少的了,但是自己一开始傻傻的卡了好久……
开始一个403,不过作为ctfer,千万不要相信这个403是真正的403,那么先抓个包,果不其然
提示存在302,那么直接访问index.php吧,抓包后发至repeater发现存在405,那么果断改成POST请求方式,得到:
那么提示通过url传值,那果断传/?a=5+5
啊,结果返回说“再想想”。自己顿时陷入迷茫,一开始想是不是不是用+连接,后来又想,基于题目是codeworld,是不是要代码执行?但是fuzz了一下,发现并没有回显执行的点。于是陷入迷茫。后来,自己在检查自己抓的包时,意外发现了一点:
对了!在进行get传值时,他会把加号处理成空。也正因如此,题目才会要求url传值并使用相加这种方式来设置限定。所以payload即为
/?a=5%2B5
🐔尼泰玫
游戏题hhh但从游戏角度过分难了。显然游戏只是幌子,应该找到网站里能post值的操作,于是尝试狂点‘开始游戏’,果然提示需要300000分时抓到post包。改包就好。
Crypto
InfantRSA
有生之年还能做出RSA……因为看到RSA几个参数提示的很清楚就干脆去网上嫖脚本了。在装库的时候就很无奈,gmpy2总是弄不好。最后去找了个whl,pip install下总归能用了
import gmpy2
import binascii
p = gmpy2.mpz(681782737450022065655472455411)
q = gmpy2.mpz(675274897132088253519831953441)
e = gmpy2.mpz(13)
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e, phi_n)
c = gmpy2.mpz(275698465082361070145173688411496311542172902608559859019841)
m = pow(c, d, p*q)
print("十进制:\n%s"%m)
m_hex = hex(m)[2:]
print("十六进制:\n%s"%(m_hex,))
#print("ascII:\n%s"%((binascii.b2a_hex(hex(m)[2:])).decode('hex'),))
print("ascii:\n%s"%(binascii.a2b_hex(m_hex).decode("utf8"),))
misc
欢迎参加HGame!
Li0tIC4uLi0tIC4tLi4gLS4tLiAtLS0tLSAtLSAuIC4uLS0uLSAtIC0tLSAuLi0tLi0gLi4tLS0gLS0tLS0gLi4tLS0gLS0tLS0gLi4tLS4tIC4uLi4gLS0uIC4tIC0tIC4uLi0t
一开始不太清楚这是什么编码,后来百度一下发现就是base64。回头想想,发现毕竟是数字+字母的组合,可以考虑base系的编码。
解码后为morse电码,在线解一下就好了。
壁纸
题目下下来打开是个图片,扔winhex里看发现末尾提示flag.txt以及密码是图片id,图片名则标注了pixiv。。。估计是要改成压缩包了,所以也没去看有没有压缩包文件,头就直接改zip,果不其然是压缩包,内容为flag.txt,需要密码。那就直接上p站找这个画师吧(感觉吃了一波强行安利啊)找到图片后用密码看flag.txt,最后结果ascii解码一下就好。
签到题ProPlus
一时兴起还是看了看这道misc。上来先给了一个压缩包一个文件,文件内容
Rdjxfwxjfimkn z,ts wntzi xtjrwm xsfjt jm ywt rtntwhf f y h jnsxf qjFjf jnb rg fiyykwtbsnkm tm xa jsdwqjfmkjy wlviHtqzqsGsffywjjyynf yssm xfjypnyihjn.
JRFVJYFZVRUAGMAI
* Three fenses first, Five Caesar next. English sentense first, zip password next.
看到fences跟ceaser就想到了栅栏跟凯撒密码了。加上提示先3栅栏,再5凯撒,那么在线解下码,对应组数与偏移数分别为3,5即可。解出来前面一句话如下:
Many years later as he faced the firing squad, Colonel Aureliano Buendia was to remember that distant afternoon when his father took him to discover ice.
出自百年孤独,不知道有什么用。解出的密码用来解压加密的压缩包,得到文档
data:text;ook,
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.............
有点摸不着头脑,于是谷歌一下,发现这是属于brainfuck编码中的一种,不禁让我联想到了原来伤眼睛的jsfuck编码……那么在线解码一下(找个好点的网站,开始我找的网站只解了一部分),得到base32编码。再base32解码,发现得到的结果可以进行base64解码,且结果开头有图片的文件头。那么可以确认是图片文件内容进行了base64编码。那直接解出文件就好了(可以用python,也可以在线)。得到二维码,直接扫码得flag。