为什么我收到的字节不是我发送的字节?

为什么我收到的字节不是我发送的字节?

我一直在通过安全游戏网站工作,尝试使用自动化我正在做的事情破解工具。然而,我在流程中的某个地方遇到了问题。当我尝试使用我的漏洞利用字符串在服务器上运行易受攻击的程序时,它会在我的计算机上的 Python 2.7 脚本之间的某个位置发生更改,然后返回给我。

我应对这一特定挑战的一般流程如下:

  1. 启动 SSH 连接
  2. 通过 SSH 连接打开 shell,我尝试过“/bin/bash”、“/bin/sh”
  3. 等到我收到提示
  4. 以“%s %s” % (program_on_server, payload_string) 格式发送命令

我的有效负载字符串是重复多次的字节“\x74\x84\x04\x08”。我遇到的问题是,当服务器回显我发送到正在运行的 shell 的内容时,它会转换为“\x74\x84\x07\x08\x1b\x5b\x4b”。经过一些故障排除后,我无法弄清楚额外的字节来自哪里,或者为什么 \x04 变成了 \x07。 Pwntools 似乎认为它发送了正确的字节,调试输出至少显示了正确的字节,所以我认为问题出在从 ssh 到 bash 到易受攻击程序的链中服务器端的某个地方。因此,将其发布在这里,而不是与 pwntools 更相关的地方。有谁知道可能造成这种情况的原因以及这样做的原因吗?

以下是我的代码,其中包含登录信息所在的函数。

#!/usr/bin/python2
from pwn import *

context.log_level = 'debug'

def makePayloadString():
    return p32(0x8048474)* 20 # p32 takes a 32 bit number and converts it to bytes

sshConnection = ssh(user=getUser(), host=getHost(), password=getPassword())
command = "%s %s" % (getProgramLocation(), makePayloadString())
shell = sshConnection.shell("/bin/bash")
shell.recvuntil("$ ", timeout=10)
shell.sendline(command)
shell.recvline(timeout=10)

答案1

看来您从服务器端返回的字节来自 shell,对输入字节做出反应,就像它们被输入到终端会话中一样。

不确定 0x84 被解释为非 7 位 ascii 代码,但 0x04 相当于 Ctrl-D (EOF) 字符,如果不在行的开头输入,bash 将拒绝。 Bash 将发送一个 0x07 (BEL) 字符到终端来敲响铃声(嘟嘟声)。 0x08 是一个退格 (BS) 字符,bash 回显 ANSI 转义序列 (ESC[K) (\x1b\x5b\x4b),该序列将输入光标退后一个空格。

在交互式终端中,尝试输入字符“t”,您应该能够以近似的方式重现您所看到的编程输出。

也许这些字节应该发送到不同程序的输入而不是 bash 或 sh ?

相关内容