【问题标题】:p64() from pwntools not working correctlypwntools 中的 p64() 无法正常工作
【发布时间】:2020-04-09 08:44:26
【问题描述】:

我想将输入发送到包含不可打印字符(如“\x90”)的进程。当我尝试像这样发送它时:p.sendline(p64(0x414190)),我的程序将它打印回来,返回AA\x90。它将 "\x90" 作为一个字符串,而不是一个字节。有人可以帮我如何发送原始字节吗?

我的程序(容易格式化字符串,我不需要被告知):

#include <stdio.h>

int main() {
  char name[512];
  char passwd[512];

  printf("Enter your name: ");
  fgets(name, sizeof(name), stdin);
  printf(name);

  printf("Enter your password: ");
  fgets(passwd, sizeof(passwd), stdin);
  printf(passwd);

  exit(1);
}

【问题讨论】:

    标签: c python-2.7 format-string pwntools


    【解决方案1】:

    使用p64() 确实将输入作为原始字节发送。您可以通过在运行脚本时添加 pwntools 的 DEBUG 标志来检查它。调试输出然后打印发送和接收的所有内容。例如:

    python2 solve.py DEBUG
    [+] Starting local process './script': pid 23732
    [DEBUG] Received 0x11 bytes:
        'Enter your name: '
    [DEBUG] Sent 0x9 bytes:
        00000000  90 41 41 00  00 00 00 00  0a                        │·AA·│····│·│
        00000009
    [*] Switching to interactive mode
    [DEBUG] Received 0x18 bytes:
        00000000  90 41 41 45  6e 74 65 72  20 79 6f 75  72 20 70 61  │·AAE│nter│ you│r pa│
        00000010  73 73 77 6f  72 64 3a 20                            │sswo│rd: │
        00000018
    \x90AAEnter your password: $ 
    

    在上面的示例中,您会看到字节 90 41 41 00 00 00 00 00 0a 被发送到程序,而不是字符串 \x90

    【讨论】:

    • 顺便说一句,我没有解释为什么它被打印为字符串\x90,因为我不知道。我想这是因为 0x90 是不可打印的字符。我在 ASCII 表中找不到它,所以可能打印的十六进制值看起来不错。
    【解决方案2】:

    实际上 pwntools 完全正常工作,真正的问题是由 python 的语法产生的。 如果只使用 print() 打印反馈,python 会将其视为“字符串”而不是“字节”。

    【讨论】:

      猜你喜欢
      • 2016-12-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 2018-04-08
      • 2017-04-20
      相关资源
      最近更新 更多