【问题标题】:Properly storing an 8 Byte Value in an assembly在程序集中正确存储 8 字节值
【发布时间】:2019-09-06 20:53:12
【问题描述】:

我有特定的指令将“/bin/sh”的 8 字节十六进制值存储在 %rax 寄存器中。

所以 8 字节意味着 64 位.. 所以我的第一个方法是使用 movq 命令.. 但我无法确定如何正确格式化命令。

/bin/sh 十六进制为:2f 62 69 6e 2f 73 68 只需要 7 个字节.. 是否有某种空终止符或填充我可以正确写入命令?

  # Write the 8-byte hex value for "/bin/sh" to %rax register
  movq $0x68732f6e69622f, %rax

最终该命令将被系统调用使用

谢谢!

【问题讨论】:

  • 请注意,由于字节顺序,您需要翻转字节顺序。另外,我想知道您为什么要将这些字符放入寄存器中;所有系统调用都期望寄存器包含指向字符串的指针。
  • 我以为我在代码中做对了?是否需要空终止符或任何使其变为 8 个字节的东西
  • 阅读@fuz 的评论,您可能误解了您的“具体说明”。除非这是您自己实现的实验性系统调用...
  • 再次阅读您的帖子,看来是的,您确实做得对!请注意,字符串已经以 NUL 结尾。您可以通过movq $0x0068732f6e69622f, %rax 明确强调这一事实。

标签: c assembly hex ascii


【解决方案1】:

寄存器是一个特定的大小,所以无论你做什么它都占用 64 位。它会在高位有效地补零。将$0x1 移入其中的最低值有一个位,其余为零。

您不会“空终止”这些值,否则会产生将事物乘以某个任意因子的效果。 $0x1000 显然与$0x0001 不一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-17
    • 2020-09-16
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2013-10-09
    • 2016-07-30
    • 1970-01-01
    相关资源
    最近更新 更多