hgame的一些小题
hgame的一些小题
reverse
helloRe
首先用ida打开去分析一下(64位)
其实我是想用OD动调一下,但它是个64位的,动态调试的话的用dbg了,所以ida看一下吧,它是个C++写的代码了:
然后就要看一下涉及了那些数据了,sub_140001430()和asc_140003480[v0]这两个数据,去追踪一下看看:
还有一个
分析到者就到了最后一步,写脚本了:
这样子flag就得到了。
pypy
这个题是python的字节码,需要我们去了解这些知识,其实有些简单的语句还是很好猜到的。
下面我就列一下字节码:
LOAD_CONST : 加载const 变量,比如数值,字符串等等, 一般用于传递给函数作为参数
LOAD_FAST : 一般用于加载局部变量的值,也就是读取值,用于计算或者函数调用传传等
STORE_FAST : 一般用于保存值到局部变量
LOAD_GLOBAL : 用来加载全局变量, 包括制定函数名,类名,模块名等全局符号
STORE_GLOBAL :用来给全局变量赋值
BUILD_LIST : 用于创建一个 list 结构
BUILD_MAP : 用于创建一个空的dict
STORE_MAP : 用于初始化 dict 中的内容,赋值给变量
BUILD_SLICE : 用于创建切片, 对于 list , tuple , 字符串都可以使用slice 的方式进行访问
BINARY_SUBSCR : 读取slice 的值
STORE_SUBSCR : slice 的值赋值给变量。
SETUP_LOOP : 用于开始一个循环。
JUMP_ABSOLUTE: 结束循环
POP_JUMP_IF_FALSE : 条件结果为 FALSE 则跳出 目标的偏移指令
JUMP_FORWARD : 直接跳转到目标便宜指令
COMPARE_OP: 比较指令
4 0 LOAD_GLOBAL 0 (input) //加载的意思
2 LOAD_CONST 1 ('give me your flag:\n') //会取出co_consts里的第consti个值
4 CALL_FUNCTION 1 //这个应该就是=号了,即是赋值
6 STORE_FAST 0 (raw_flag) //第一行的赋值者raw_flag
5 8 LOAD_GLOBAL 1 (list) //这个就是个语句了list
10 LOAD_FAST 0 (raw_flag) //list(raw_flag[6:-1])
12 LOAD_CONST 2 (6)
14 LOAD_CONST 3 (-1)
16 BUILD_SLICE 2
18 BINARY_SUBSCR
20 CALL_FUNCTION 1
22 STORE_FAST 1 (cipher) //这个就是第二行的赋值者cipher
6 24 LOAD_GLOBAL 2 (len) //语句len
26 LOAD_FAST 1 (cipher) //len()
28 CALL_FUNCTION 1
30 STORE_FAST 2 (length) //第三个赋值者length
8 32 LOAD_GLOBAL 3 (range) //range语句
34 LOAD_FAST 2 (length)
36 LOAD_CONST 4 (2)
38 BINARY_FLOOR_DIVIDE //到了最后,还是这条语句卡住我(哈哈)它应该是np.floor_divide这个函数吧
40 CALL_FUNCTION 1
42 GET_ITER
>> 44 FOR_ITER 54 (to 100) //for循环 应该循环到100句,即下一条语句正是循环的语句
46 STORE_FAST 3 (i) //第四个赋值者i
9 48 LOAD_FAST 1 (cipher) //cipher这个变量
50 LOAD_CONST 4 (2) //2
52 LOAD_FAST 3 (i) //i,发现下面具有重复的语句
54 BINARY_MULTIPLY //这条语句就必须想办法搞懂,它是个*号,就是乘法啦
56 LOAD_CONST 5 (1)
58 BINARY_ADD //加法
60 BINARY_SUBSCR //加载,也就是读取数据了
62 LOAD_FAST 1 (cipher) //cipher
64 LOAD_CONST 4 (2) //2
66 LOAD_FAST 3 (i) //i
68 BINARY_MULTIPLY //乘法
70 BINARY_SUBSCR //加载
72 ROT_TWO //关键语句 交换
74 LOAD_FAST 1 (cipher) //cipher
76 LOAD_CONST 4 (2) //2
78 LOAD_FAST 3 (i) //i
80 BINARY_MULTIPLY //乘法
82 STORE_SUBSCR //加载
84 LOAD_FAST 1 (cipher) //cipher
86 LOAD_CONST 4 (2) //2
88 LOAD_FAST 3 (i) //i
90 BINARY_MULTIPLY //乘法
92 LOAD_CONST 5 (1)
94 BINARY_ADD //加法
96 STORE_SUBSCR
98 JUMP_ABSOLUTE 44 //这个代表着结束循环,与SETUP_LOOP搭配是while循环
12 >> 100 BUILD_LIST 0 //这个查到是[]这个东西
102 STORE_FAST 4 (res) //这里应该是 res = [] 这个东西了
13 104 LOAD_GLOBAL 3 (range) //range语句
106 LOAD_FAST 2 (length) //for i in range(length)
108 CALL_FUNCTION 1
110 GET_ITER
>> 112 FOR_ITER 26 (to 140) //这里应该也是个for循环 到140句
114 STORE_FAST 3 (i)
14 116 LOAD_FAST 4 (res) //res新的变量,对应着flag了
118 LOAD_METHOD 4 (append) //append函数
120 LOAD_GLOBAL 5 (ord) //ord函数
122 LOAD_FAST 1 (cipher) //cipher变量
124 LOAD_FAST 3 (i) //i
126 BINARY_SUBSCR //读取切片中的值
128 CALL_FUNCTION 1
130 LOAD_FAST 3 (i) //i
132 BINARY_XOR //这个应该是^异或运算啦
134 CALL_METHOD 1
136 POP_TOP //这个它最后应该是res.append(ord(cipher[i])^i)
138 JUMP_ABSOLUTE 112
15 >> 140 LOAD_GLOBAL 6 (bytes) //bytes函数
142 LOAD_FAST 4 (res) //res
144 CALL_FUNCTION 1
146 LOAD_METHOD 7 (hex) //hex函数,这个是个方法,其实可以理解成内置函数,需要“.”这个东西啦
148 CALL_METHOD 0
150 STORE_FAST 4 (res) //res
16 152 LOAD_GLOBAL 8 (print) //这里大胆猜测就是输出flag了
154 LOAD_CONST 6 ('your flag: ') //rse应该就是flag了
156 LOAD_FAST 4 (res) //print('your flag:'+res)
158 BINARY_ADD //+号
160 CALL_FUNCTION 1
162 POP_TOP
164 LOAD_CONST 0 (None)
166 RETURN_VALUE
# your flag: 30466633346f59213b4139794520572b45514d61583151576638643a
然后我就卡在了LOAD_METHOD这个语句当中了,便想一次又一次去尝试它,毕竟到了最后的一步了。然后在我的一直坚持下,并且查阅资料,终于完美的对应上了字码节,上代码:
此时我们用flag去输入这个代码,发现了输出的并不是我们想要的flag
我们又要写脚本了,哎,好不容易破解出,没想到是加密的脚本了,唉唉!写吧,没办法。
web
watermelon
这个打开就是个游戏,发现有点小,所以猜测是手机端(移动端),就改用了谷歌里面的手机端来查看去解它。
hgame{do_you_know_cocos_game?}
这便是flag了,这个是(剽窃)借鉴(抄袭)的。
pwn
whitegive
这道是pwn的签到题,还是简单的,附件里直接有代码,代码是个比较,而此时我们就要想办法去比较成功:
然后我们用ida找到paSsw0rd这个的地址:
此时我们就可以直接找到flag了:
Crypto
まひと
首先是摩斯密码,我们就用在线网站接下秘,然后是ascll码,写了个小脚本来转换成字符:
后面有==号,就怀疑是base64解密,接下它:
然后出现个名词是Vigenere,可能是维吉尼亚解密了,但此时需要密钥。Liki就是密钥,如下解密:
}KccnYt!1NlPpu!zeE1{C+9pfrhLB_Fz~uGy4n
接下来就是神奇的地方了,在做这道题时,我和同学讨论时,他们的观点是有一个隐藏的hint,我当时想的是,肯定应该有 栅栏 解密,因为刚开始是hgame{}这样子的,而上面的{}这个没有在那个位置上,所以猜想需要一个转换{}字符的解密过程。
然后接下来在网上找到了接下来的正确的解密过程,是个栅栏6解密,
}!!Ch~K1z+LucNe9BGclEp_ynP1fF4Yp{rzntu
然后rot13解密:
}!!Pu~X1m+YhpAr9OTpyRc_laC1sS4Lc{emagh
翻过来就是flag了。
misc
Base全家福
这个其实就是用base64,32,16依次解密即可,毕竟提示是有关base的,很明显了。
不起眼压缩包的养成的方法(未做完)
这个一弄就可以看到:
它说有密码,那说明有用到密码的地方。然后通过linus-kali的方法找到了那个压缩包(binwalk或foremost):
此时就需要密码了。
是个zip压缩包,暴力破解一下,就能解开,主要是接下来,又来了个zip,这时就要用明文攻击了:
Word RE:MASTER
这道题听了大师傅的话,主要是以前没见过,所以费了点力气,首先刚开始是有两个文档的,第一个文档没有加密,第二个文档加了密。我首先思路就是暴力破解加密的文档,但大师傅并不是这样子的。
后来思路想到了第一个文档里的那串特殊的字符和一张图片,图片里面什么也没有,可能有吧(我没发现)
然后:
发现是个brainfuck加密,解密后如下:
DOYOUKNOWHIDDEN?
输入第二个word,对了,那么再看看是个图片,此时应该就用到了图片隐写吧,但很遗憾,不是:
刚开始我进去只有图片,其它的东西是隐藏的,不能够找到,需找到word选项里将它给去除。就能够显示了。此时,它是个snow隐写.
此时输入
snow.exe -C (txt的文件,即要进行解密的txt文档)
如下flag:
hgame{Cha11en9e_Whit3_P4ND0R4_P4R4D0XXX}
前言
小白一个(刚接触ctf不久),看看了逆向,发现一道不会(有点思路,但最后还是做不出来),大师傅们别嘲笑。后来我就开始做misc了(做的也不多)
One_piece
这个我做的,其它的我队友做的,(没想到逆向不会)
因为刚开始提示四位数字,那我们就可以使用暴力破解:
然后解压,就可以看到有两个内容:一个C编写的程序,和一个txt文档;
而文档里我们可以知道一些信息,再结合c语言的程序,可知我们少个key。
看到密文,我们就知道这是个社会主义核心价值观解密:
然后又是个解密,可以看到一些比较熟悉的东西,可知这是个brainfuck解密,因为它只有><±.,[]的组合来完成:
解密就看到了glbe{pnf_njedc_js_ufjs_kmvrocz!}这个;
到这我们就差最后一步了,那我们可能就要用到密钥了,c程序中有四个判断条件,那我们就加上这四个条件,让它们运行起来,拿到密钥。
运行一下:
它告诉了一个密钥,那我们来想想需要密钥的解密有哪些,自然想到了维吉尼亚解密:
这样flag就得到了!
小火龙冲啊
下载解压得到张图片:
刚开始肯定看属性(是为了看它的大小),就会感觉到它其实是可能有隐藏的东西。所以用Linus打开(使用binwalk这个命令)
发现压缩包,打开又是个加密的:
到这个时候,是有几个思路的,爆破(但这个是有风险的),这里可是能花好多时间的,又反过来看图片的十六进制:
用winhex打开,发现最后有一串可疑数字,那我们就输入进去看看,就能得到flag了。
这个是队友做的,整理了一下。
下面是一些比较简单的签到题,逆向两道,还比较简单,所以补充到下面啦。
Re1:
这道题刚上来就用EP看下它的信息。
发现是upx壳,用命令 upx -d re1
可以解出来了。
Ida打开,搜索字符串,有几个特殊字符串,第一题应该没那么难,并且我没有看到有什么加密的代码,所以就直接去试试这些字符串,发现就是flag。
Re2
这道题其实也没那么难,没有什么加密大的,是用C++写的,但是依然比较简单啦
这样子就是可以了,hint是key就是flag,这里dword_42537C就是flag,把它算出来就行了。
hello CPY
这道题也不难,主要是考察脚本的能力,分析脚本,无非就是一个随机数,它还是1到10,很简单了,试试都能试出来,然后我们就可以写出脚本啦
运行一下flag就出来了,这力我主要运用的爆破的思想,把flag{}里面的内容爆破出来。