题目信息
nc pwn2.jarvisoj.com 9895
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 | from pwn import * |
getflag
