# WEB
# capoo
发现获取图片通过的是文件路径,尝试路径穿越读取,发现可以读出数据。传入 capoo=/var/www/html/showpic.php
得到源码。
1 |
|
发现开头有一个类,内部可以 getshell
,传参处有一处写文件点,猜测可以传入 phar
反序列化,但是题目过滤了 PILER
,考虑使用 gzip
压缩后再操作。
构建 phar
源码:
1 |
|
最后考虑 waf
问题。由于在 linux
中,一些空字符可以用一些变量表示,例如空格使用 $IFS
,无字符可使用 $1
(此前无命令情况下),由此,执行命令 ls /
相当于 l$1s$IFS/
。找到 flag
名称是 flag-33ac806f
;最后读取 flag
,将弄好的 phar
文件 gzip
压缩后上传到 vps
,然后下载并反序列化拿到 flag
。
最终 payload
:
1 |
|
# ez_picker
根据题面的函数 merge
1 | def merge(src, dst): |
推测可以进行原型链污染,根据这个原理,可以将原先随机的 secret_key
和白名单污染(实践可知,白名单上的根本无法 getshell)。
1 | import requests |
执行上述脚本后,可以在注册新用户的同时修改白名单和密钥。
最后根据修改后的白名单,选中 builtins
模块,以 dict
属性为起点,找到 eval
函数,执行代码,最终反弹 shell
即可得到 flag
。
1 | payload='''cbuiltins |
# PWN
# signin
开始时伪随机密码需用 ctype 执行库函数进行计算。
虽说是堆题,但是在 add 中有一个函数可以进行栈溢出,所以其实是栈溢出题。
用堆泄露 libc 地址,进行栈迁移,然后进行 orw。
1 | #!/usr/bin/python3 |
# sign_revenge
更简单了
直接栈迁移。然后 orw。
1 | #!/usr/bin/python3 |
# ezcode
用 json 传输 shellcode。格式大致为, shellcode
作为属性名,汇编代码二进制编码转换为十六进制字符串,作为属性值,例如。
1 | { |
而这题最难的地方在于,题目在输入后将 shellcode 区域设为仅执行,且只能输入汇编代码 0x16 字节(对应 16 进制字符串 0x32 字节)
因此考虑使用 mprotect 配合 read 进行改写 shellcode 区域权限,重新写入 shellcode。
正常构造肯定超出长度。所以用 cdq
代替 xor edx,edx
,这样可以从 2 字节减少为 1 字节。用 cdq;div idiv ecx
替代 xor eax, eax; xor edx, edx; mov dl, 0xff
。前者奇迹般的能算出商 eax 为 0,余数 edx 为 0x54。只需 3 字节。而后者需要 6 字节。
省吃俭用刚好 0x16 字节构造好 mprotect(buf, 0x9998, 7);read(0, buf, 0x54);
,然后就可以构造 orw 的 shellcode 了。
1 | #!/usr/bin/python3 |
# guest_book
理论上应该是 house of cat。但是该程序未检查输入的 index,可以实现越界读写,由此实现任意地址读写。
具体流程如下:
堆块地址存放在 0x4060 处,8 字节一元素。大小存放在 0x40e0,4 字节一元素。而 add
读取 size 时直接写入对应位置。因此申请编号为 0,1 的 chunk,即可利用其 size 在 0x40e0 处伪造一个地址。使用编号 16 即可访问该地址。若需编辑,则需在编号 16 对应的 size 区域伪造一定数据。
先利用 largebin chunk 泄露堆地址和 libc 地址,然后泄露 environ 处值,算出栈上 edit 函数返回地址存放位置,在该处分配块,覆写 rop 链。
1 | #!/usr/bin/python3 |
# qwen
这题有两附件,pwn2 需在 pwn1 拿到 shell 后才可获得。利用 pwn2 对不可读的 flag 进行读取。
# pwn1
下棋。无所谓输赢。在结束游戏后可以往 buf 输入数据,存在溢出,可以修改到函数指针 v11。
下子时,若输入数据越界,则会触发报错函数,触发方式为执行 v11 的函数指针。
因此,可以在完成一局后修改 v11,然后在第二局中直接越界,进行任意地址执行。
开启了地址随机,所以仅能跳转到程序的其他地方。刚好有个后门函数,但需爆破倒二字节。
后门函数可以读取文件并输出,文件名有过滤,读取不了 flag(其实没过滤也读不了)。因此考虑读取 /proc/self/maps
,由此泄露 libc 地址和程序地址。
然后就可以快乐构造 rop 链,再把结束时的写入 buf 用上。用 add rsp, 0x68; ret
来执行 buf 内的 rop 链。
# pwn2
拿到 shell 后,会发现 flag 在 /home/ctf
,属于 root,权限 600。而 pwn2 有个 s 权限。
pwn2 中,有 5 种功能,其中, -c
可以实现以文本形式打包文件。打包完的文件可读写。由此可以直接对 flag 文件进行打包,然后利用 cat 进行输出。利用 base64 提取完整文件
1 | ./pwn2 -c tar flag |
将其在本地还原,得到 flag。
脚本如下,需爆破:
1 | #!/usr/bin/python3 |
# MISC
# ezflag
tcp 流量提取出压缩包
解压改后缀得到 flag
# PvZ
根据提示,生成 1-10000 的数字的 md5 值的密码本对压缩包进行爆破
解压后发现是缺失定位块的畸形二维码
对二维码进行补全
解码后通过特征发现是 malbolge 编程语言,利用在线网站进行解密。
# RE
# Serv1ce
利用模拟器检查观察运行逻辑,利用 jadx 寻找 main 函数,发现调用了 libServ1ce.so,且传入了输入值,经过加密后的 key 和一个 num
so 主函数,其使用 a5
作为乘法因子,与 v6
偏移处的字节和 v5
中的字符进行异或运算。
通过以上逻辑写出解密脚本
1 | DELTA = 0xA4B46062 |
# CRYPTO
# xor
签到题,通过题面即可得到