HGAME week 1 writeup

改请求头?

www.jianshu.com/p/8f485bf6c…

  1. Referer: vidar.club/

??? blog.csdn.net/qq_42777804…

第二步:X-Forwarded-For: 127.0.0.1

事好多!中间还要求2077年以后再来

User-Agent: Cosmos Browser
Referer: https://vidar.club/
X-Forwarded-For: 127.0.0.1
If-Unmodified-Since: Tue, 15 Nov 2078 08:12:31 GMT
复制代码

blog.csdn.net/qq_42350419… 非常全的请求头总结

改一下请求方式,改成POST

hgame{W0w!Your_heads_@re_s0_many!}

Code World

访问一下网址

啥都没?审查元素看一下

ummmmm...那怎么才能让它不重定向呢?在网上找,发现了这个 blog.csdn.net/Deep___Lear… ,可以用 curl 不加参数的方式防止网页重定向

405 Not Allowed ,应该是因为错误的请求方式和响应头中的 Allow 不匹配导致的,如何用 curl 模拟请求方式呢?请看这里:

www.ruanyifeng.com/blog/2019/0… blog.csdn.net/fungleo/art…

试一下 curl -X 指定 POST 方式提交请求

(中间怎么试都没反应,就这样过了两天,真的不想写了,but今天下午又试了一下)

之前之所以一直没反应,是因为使用了 curl -X POST -d "a=5+5" -v codeworld.hgame.day-day.work 这样的方式提交的,然而题目给出了提示,是我一直没当回事(太蠢了蠢死了啊啊啊),正确的方式应该是用url构造的方式提交参数,也就是url后加 ? 加参数来进行参数提交,今天突发奇想用 curl -X POST -v codeworld.hgame.day-day.work/?a=5+5 提交了一下,终于看到有反应了qwq

然后放进了burp里,其实之前就尝试过,在这里还是burp用得不熟惹的祸,在repeater里提交时应该 选择url提交

而至于刚刚的提示“再想想”,在看到题目的一瞬间灵光一闪!Code isexciting,code还有编码的意思,提交方式已经确定了(因为有反应),“通过url提交”这句话会不会有用url编码提交的含义?

这里又试了一次,可能程序计算方式有问题,url编码 a=5+5 提交以后结果为5,所以编码了一下 a=10+10 ,即提交了 %61%3d%31%30%2b%31%30 ,计算结果为10,成功拿到flag

hgame{C0d3_1s_s0_S@_sO_C0ol!}

:chicken:尼泰玫

f12说是开源,直接在github上找到了源码...

hgame{j4vASc1pt_w1ll_tel1_y0u_someth1n9_u5efu1?!}

web总结

整体还算简单,就是Code World那道题因为提交方式不对真的废了很长很长时间,还是基础不牢靠啊

Pwn

Hard_AAAAA

说真的是第一次做pwn...照着网上画瓢,先用 checksec 看一眼

然后?然后不会做,pwn和re没一道会的,等着看wp了,bye

Misc

欢迎参加HGame!

Li0tIC4uLi0tIC4tLi4gLS4tLiAtLS0tLSAtLSAuIC4uLS0uLSAtIC0tLSAuLi0tLi0gLi4tLS0gLS0tLS0gLi4tLS0gLS0tLS0gLi4tLS4tIC4uLi4gLS0uIC4tIC0tIC4uLi0t
.-- ...-- .-.. -.-. ----- -- . ..--.- - --- ..--.- ..--- ----- ..--- ----- ..--.- .... --. .- -- ...--
hgame{W3LC0ME_TO_2020_HGAM3}

壁纸

尝试读取了一下exif,无果,然后尝试改压缩包,成了!

提示压缩包密码是图片id,找图片id的时候甚至不敢在爸妈面前找...顶不住

梯子最近挂了,只能墙内识图...在 www.sohu.com/a/343467720… 找到了id是76953815,得到文件中的信息是 \u68\u67\u61\u6d\u65\u7b\u44\u6f\u5f\u79\u30\u75\u5f\u4b\u6e\u4f\u57\u5f\u75\u4e\u69\u43\u30\u64\u33\u3f\u7d ,竟然还是十六进制的unicode?转一下

a="6867616d657b446f5f7930755f4b6e4f575f754e69433064333f7d"
ori_slice=[]
hex_str=""
for i in range(0,len(a),2):
    ori_slice.append(a[i:i+2])
for m in range(0,len(ori_slice)):
    print(chr(int(ori_slice[m],16)),end="")
复制代码
\u104\u103\u97\u109\u101\u123\u68\u111\u95\u121\u48\u117\u95\u75\u110\u79\u87\u95\u117\u78\u105\u67\u48\u100\u51\u63\u125
hgame{Do_y0u_KnOW_uNiC0d3?}

克苏鲁神话

提示用7z???刚开始根本搞不懂(我好菜呜呜呜...),上网查到了一个zip攻击的总结https://www.freebuf.com/column/201834.html,应该是和里面一样的明文攻击,尝试了一下后可以看到CRC是一样的

照葫芦画爷爷,用ARCHPR明文攻击

打开doc文档

试了好几次大小写转换,甚至还hex-editor打开文件看了一眼...

竟然没想到文件名就是Bacon...应该是Bacon密码(凌晨三点我就应该乖乖睡觉而不是做题...)

Bacon密码可以看这个: www.cnblogs.com/xdjun/p/739…

程序太长了不在这放了

doc的密码应该是 FLAGHIDDENINDOC (题目提示密码是大写)

看了一遍文档没有flag,应该是被隐藏了,设置勾选显示隐藏文字

hgame{Y0u_h@Ve_F0Und_mY_S3cReT}

签到题ProPlus

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.

题目给的很清楚了,三次栅栏五次凯撒,栅栏自己写了个小程序跑了一下

def fence(fence_cipher, layer):
    one_layer_len = int(len(fence_cipher) / layer)
    plaintext=''
    for i in range(one_layer_len):
        # 步长为每层的长度
        tmp_str = fence_cipher[i::one_layer_len]
        plaintext+=tmp_str
    print('The plaintext is:\n%s' % plaintext)

if __name__=="__main__":
    cipher = input("Please enter the cipher:\n")
    layer = int(input("Please enter the layer:\n"))
    fence(cipher, layer)
复制代码
Rfsd djfwx qfyjw fx mj kfhji ymj knwnsl xvzfi, Htqtsjq Fzwjqnfst Gzjsinf bfx yt wjrjrgjw ymfy inxyfsy fkyjwstts bmjs mnx kfymjw yttp mnr yt inxhtajw nhj.

凯撒直接找了个在线的解了一下

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.

???是百年孤独的开头,什么鬼...结合克苏鲁神话来看,出题人是想在misc里疯狂安利自己喜欢的东西,假公济私!

反正知道算法是对的了(并不,接下来倾诉血泪史),接下来解一下zip的密码

上面的算法有一个坑,那就是当字符串长度不是层数的整数倍的时候,原密码 JRFVJYFZVRUAGMAI 解出来的会是这样的 JYUIRFAFZGVVMJRA
实际用的分解是 JRFVJ YFZVR UAGMA I ,有四层,而正确的分解应该是 JRFVJY FZVRU AGMAI ,即第一层有六个字符

把我的一个下午都坑进去了...感谢 这个网站 ,不知道它的源码是怎么解得,总之肯定不会是我那样...

三次栅栏:JFARZGFVMVRAJUIY

五次凯撒:EAVMUBAQHQMVEPDT

打开txt,满屏的Ook

有三种符号.?!和好多好多Ook,实在想不懂是什么密码,上网查了一下ok密码,还真让我找到了,就是一种叫Ook的编码...见 blog.csdn.net/qq_43624293…

转一下

base32再解一次

???什么鬼,base64试试?

!!!出题人也太会了8,linux下base64解码写入png

得到flag

hgame{3Nc0dInG_@lL_iN_0Ne!}

每日推荐

“这是一个,E99p1ant和ObjectNotFound之间发生的故事。” “事情,还要从一个风和日丽的下午说起。ObjectNotFound正听着网易云每日推荐...” 算了算了,想不出什么题目介绍了,就这样吧。

题目地址下载以后是一个压缩包,压缩包里是一个 wireshark.pcapng 文件

网上说 wireshark 的题一般flag都在 http 流里,那么先来筛选并导出所有 http 文件

按从大到小排序,感觉有着 upload 字样的文件有、可疑,因为给的包里流量非常大,会不会是黑客通过上传漏洞进行渗透呢?打开这些文件来看一下

头部告诉了我们上传的文件有一个压缩包, hex-editor 看一下,一堆乱码直接拉到最下面

有一首歌名?去网易云找了一下,评论都在吆喝“给我flag”23333333,还有密码提示?不知道是什么密码(其实是压缩包的),继续往后看

打开了一个名称有admin的文件,看到了这样的字眼:

刚刚的压缩包应该就叫 song.zip ,猜测flag八成在这个压缩包里,在 wireshark 中筛选到相关请求,直接右键导出分组字节流保存为 song.zip ,但是要记得把头部的东西删掉,可以直接查找 zip 的文件头 50 4b 03 04 ,然后把前面的都删掉

拿到了压缩包,提示密码为6位数字, archpr 暴力破解

密码为 759371

尝试常见的音频隐写,见

xz.aliyun.com/t/1930 blog.csdn.net/pdsu1615302…

Audacity 打开,转视图为波频图,即可看到flag

hgame{I_love_EDM233}

misc感想

费了好大的劲ak了,出题人脑洞真的很大...不过也真的学到了很多!

Crypto

InfantRSA

#!/usr/bin/env python3
from secret import flag
assert flag.startswith(b'hgame{') and flag.endswith(b'}')

m = int.from_bytes(flag, byteorder='big')

p = 681782737450022065655472455411
q = 675274897132088253519831953441
e = 13
c = pow(m, e, p*q)

assert c == 275698465082361070145173688411496311542172902608559859019841
复制代码

blog.csdn.net/jijianshuai…

私钥 : ,其中

由题可知,

factordb.com/index.php?s… (真是个好网站)

电脑上的gmpy2明明安装了老是提醒我没这个模块???无奈找了个在线环境(Cloud Studio赛高!真的好好用)

转成bytes

m = 39062110472669388914389428064087335236334831991333245
s = ''
while m:
    s = chr(m & 255) + s
    m = m >> 8
print(s)
复制代码
hgame{t3Xt6O0k_R5A!!!}

Affine

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import gmpy2
from secret import A, B, flag
assert flag.startswith('hgame{') and flag.endswith('}')

TABLE = 'zxcvbnmasdfghjklqwertyuiop1234567890QWERTYUIOPASDFGHJKLZXCVBNM'
MOD = len(TABLE)

cipher = ''
for b in flag:
    i = TABLE.find(b)
    if i == -1:
        cipher += b
    else:
        ii = (A*i + B) % MOD
        cipher += TABLE[ii]

print(cipher)
# A8I5z{xr1A_J7ha_vG_TpH410}
复制代码

看起来像是改了置换表,题目给的挺全的,还有 # A8I5z{xr1A_J7ha_vG_TpH410} ,前5位肯定是 hgame

分析一下过程:

  • 若某字符b不在flag中,直接在cipher末尾加上b
  • 若某字符b在flag中,在cipher末尾加上TABLE中下标为ii的字符

题目的入手点应该是已知的前五位 hgame ,已知 MOD=62 ,模拟一下开始的流程

  1. TABLE中寻找'h', i=12 ,此时 ii = (A*12 + B) % 62 = TABLE.find('A') = 46
  2. TABLE中寻找'g',重复上述内容, i=11ii = (A*11 + B) % 62 = TABLE.find('8') = 33

由上面两个式子解一次同余方程组(算错了三四次...)取 A=13B=14 ,验证一下前五位

然后写一个逆程序

flag=''
cipher='A8I5z{xr1A_J7ha_vG_TpH410}'
TABLE = 'zxcvbnmasdfghjklqwertyuiop1234567890QWERTYUIOPASDFGHJKLZXCVBNM'
MOD = len(TABLE)

for b in cipher:
    ii = TABLE.find(b)
    if ii == -1:
        flag += b
    else:
        k=0
        while (62*k+ii-14) % 13 != 0:
            k+=1
        i=int((62*k+ii-14)/13)
        flag += TABLE[i]
print(flag)
复制代码
hgame{M4th_u5Ed_iN_cRYpt0}

not_One-time

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os, random
import string, binascii, base64


from secret import flag
assert flag.startswith(b'hgame{') and flag.endswith(b'}')

flag_len = len(flag)

def xor(s1, s2):
    #assert len(s1)==len(s2)
    return bytes( map( (lambda x: x[0]^x[1]), zip(s1, s2) ) )

random.seed( os.urandom(8) )
keystream = ''.join( [ random.choice(string.ascii_letters+string.digits) for _ in range(flag_len) ] )
keystream = keystream.encode()
print( base64.b64encode(xor(flag, keystream)).decode() )
复制代码

先看一下 map 函数的用法 blog.csdn.net/weixin_3839…

l4=map(lambda x,y:(x**y,x+y),[1,2,3],[1,2])
for i in l4:
    print(i, sep=",")
复制代码

map 函数在处理多个seq时,每次从下标0开始,只依次对多个seq的同一下标的元素进行映射,且遵循“取短”原则,因此上面的函数有: l4[0]=(1**1,1+1)l4[1]=(2**2,2+2) ,最终输出结果为 (1, 2),(4, 4)

zip 函数: www.runoob.com/python/pyth…

zip(a,b) 就是取括号中所有列表的相同的下标的元素成一个元组

开始康题

xor 函数的返回值 bytes( map( (lambda x: x[0]^x[1]), zip(s1, s2) ) ) ,是先取s1和s2相同下标的字符组成一个元组,然后用 map 函数对每个二元组中的两个bytes变量异或,, 返回了两个bytes数组中相应位置字母在顺序表中的距离绝对值 (比如e和e距离为0,m和l距离为1)

题中提到的otp是一次一密的加密算法,其特性就是每次加密(异或)的结果不同,但是如果异或所用的两个字符串有一个是不变的,那么当密文数量足够多时,就可以尝试暴力反解出不变的那个字符串,相关参考链接:

blog.csdn.net/Lynn_coder/…

www.jianshu.com/p/ea2bda3a0…

首先,按照最后几步逆回去,先转bytes然后base64解一下码,可以解得源程序中的 flag_len 应为43

然后就不会了,密钥空间也不知道怎么少了,等着看wp

Recorder

题目说是一个会加密输入的程序,那来试一下看是怎么加密的

从红框可以看出来,每次输入和输出的次序变化是固定的,那怎么拿到flag呢?

如您在上图所见,构造一个输入,使得加密后的字符是flag就可以了...算是误打误撞蒙对了orz

拿到了应该是加密后的flag

e+{jpt5I$ULmgmahRimu!T0nAT}!_eP3

看大括号的位置,感觉要再nc一次输入加密后的flag看一下

那难道是要逆过去?根据之前的试验,应该是将输入八位一组进行重排序,写一个程序求逆

encrypt_ori = '5a67e0bc98fd2431'
ori = '1234567890abcdef'

cipher = 'e+{jpt5I$ULmgmahRimu!T0nAT}!_eP3'
flag = ''
sep_cipher = []

for i in range(len(cipher)):
    find_flag = i % len(ori)
    x = encrypt_ori.find(ori[find_flag])
    # 下标为x值加上ori长度的 [i / len(ori)] 倍,用于cipher超出ori的长度
    flag += cipher[x + int(i / len(ori)) * len(ori)]

print(flag)
复制代码
hgame{jU$t+5ImpL3_PeRmuTATi0n!!}
我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章