无法理解我的shellcode是如何工作的。 Windows OS(不是Linux!)的Shellcode打开calc.exe

时间:2019-01-28 19:04:26

标签: windows assembly x86 exploit shellcode

我有一个shellcode。它会在我的缓冲区溢出程序中打开计算器。

0:  eb 16                   jmp    0x18
2:  5b                      pop    ebx
3:  31 c0                   xor    eax,eax
5:  50                      push   eax
6:  53                      push   ebx
7:  bb 4d 11 86 7c          mov    ebx,0x7c86114d
c:  ff d3                   call   ebx
e:  31 c0                   xor    eax,eax
10: 50                      push   eax
11: bb ea cd 81 7c          mov    ebx,0x7c81cdea
16: ff d3                   call   ebx
18: e8 e5 ff ff ff          call   0x2
1d: 63 61 6c                arpl   WORD PTR [ecx+0x6c],sp
20: 63 2e                   arpl   WORD PTR [esi],bp
22: 65 78 65                gs js  0x8a
25: 00 90 90 90 90 90       add    BYTE PTR [eax-0x6f6f6f70],dl
2b: 90                      nop
2c: 90                      nop
2d: 90                      nop
2e: 90                      nop
2f: 90                      nop

除了主要问题是“此shellcode逐行执行什么操作”外,我特别感兴趣:

  1. jmp操作,为什么程序在何处跳转?
  2. arpl的东西,我是第一次看到,谷歌对我没有太大帮助...与GS操作相同

1 个答案:

答案 0 :(得分:6)

jmp 0x18是相对于偏移量0x18的相对跳转,偏移量实际上是代码的结尾。然后,它调用地址0x2(再次相对)。该调用将“返回地址”放置在堆栈上,因此可以将其从堆栈中弹出,从而为您提供了执行此相对shellcode的地址的线索。实际上,偏移量为0x2的pop ebx正在从堆栈中获取地址。

我说0x18是代码的结尾,因为它后面的行是数据字节,而不是asm操作码。这就是为什么您看到arpl的原因。如果查看字节的十六进制值,则会看到:

calc.exe\0 ==> 0x63 0x61 0x63 0x6c 0x2e 0x65 0x78 0x65 0x00

已编辑:

shellcode的完整流程为:

  1. jmp 0x18-跳至shellcode的最后一条代码指令
  2. call 0x2-返回偏移量2,并将偏移量0x1D的地址存储在堆栈中
  3. pop ebx-ebx:=堆栈中的地址,它是字符串“ calc.exe”的地址
  4. xor eax,eax-通用操作码将寄存器清零:eax:= 0
  5. push eax-将值0推送为将来的函数调用的第二个参数
  6. push ebx-将指针推到“ calc.exe”作为将来函数调用的第一个参数
  7. mov ebx,0x7c86114d-ebx是固定地址(可能是WinExec)
  8. call ebx-调用函数:WinExec(“ calc.exe”,0)
  9. xor eax,eax-再次,eax:= 0
  10. push eax-将值0推送为将来的函数调用的第一个参数
  11. mov ebx,0x7c81cdea-ebx是固定地址(可能会退出)
  12. call ebx-调用函数:exit(0)