【发布时间】:2018-03-01 22:49:48
【问题描述】:
我通过 SSH 连接到远程服务器,遇到了一些二进制挑战。
有一次它要求我输入文本。我知道它使用fgets() 读取stdin,并且我可以在它被复制到的位置溢出并覆盖附近的变量。
问题是我不知道如何输入我需要的地址值,\x84 和 \x04 等。如果我能够使用 bash,我会 echo -ne "\x84" 或使用 C 十六进制数组,但我可以不要在这里做那种事。
我尝试使用十六进制到 ASCII 转换器并复制二进制字符,还使用期望脚本发送二进制值,但两者都有相同的问题。 x84 添加了一个额外的字符,而 x04 根本不会写入。
知道如何在 Unix tty 上通过 ssh 将无法用 ASCII 字符表示的值可靠地写入内存的最佳方法吗?
【问题讨论】:
-
您的问题令人困惑。您是在问如何在终端上输入控制字符,还是 C 程序如何将读取的内容写入内存?
-
如果你在操作二进制数据,你不应该使用
fgets()和朋友。那是为了读取文本数据。 -
抱歉,我现在正在打电话。可能是前者。如果我写 AAAA,我会在内存中得到 x41x41x41x41 等。如果我写 \x84 它会写 x78x38x34 等。我无法写出我想要的十六进制值,因为 fgets 将所有内容解释为 ascii 并且似乎不允许转义序列。
-
这不是真正的编程问题,而是更多关于如何使用Unix。
-
您确定您正确使用了
expect吗?当然fgets不会使用它处理程序内部的转义序列。strcpy或scanf("%s")也没有。在进行编辑之前,我没有完全阅读您的最后一条评论,所以我想我实际上通过编辑回答了您的一半问题。
标签: c terminal binary reverse-engineering tty