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

Can not understand how my shellcode works. Shellcode for windows OS( not Linux!) to open calc.exe

我有一个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的东西,第一次见google对我帮助不大...同GS操作

jmp 0x18 是到偏移量 0x18 的相对跳转,这实际上是代码的结尾。然后它调用地址 0x2(再次,相对)。这个调用将 "return address" 放在堆栈上,因此它可以从中弹出,为您提供有关执行此相关 shellcode 的地址的线索。事实上,偏移量 0x2 处的 pop ebx 正在从堆栈中获取地址。

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

calc.exe[=10=] ==> 0x63 0x61 0x63 0x6c 0x2e 0x65 0x78 0x65 0x00

已编辑:

shellcode的完整流程是:

  1. jmp 0x18 - 跳转到shellcode的最后一个代码指令
  2. call 0x2 - returns到偏移量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)