无法理解我的 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 逐行做什么”之外,我特别感兴趣的是:
- jmp操作,为什么我的程序会跳转,跳转到哪里?
- 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的完整流程是:
jmp 0x18
- 跳转到shellcode的最后一个代码指令
call 0x2
- returns到偏移量2,并将偏移量0x1D的地址入栈
pop ebx
- ebx := 来自堆栈的地址,即字符串的地址 "calc.exe"
xor eax,eax
- 将寄存器归零的通用操作码:eax := 0
push eax
- 推送值 0 作为未来函数调用的第二个参数
push ebx
- 将指针推送到 "calc.exe" 作为未来函数调用的第一个参数
mov ebx,0x7c86114d
- ebx 将是一个固定地址(可能是 WinExec)
call ebx
- 调用函数:WinExec("calc.exe", 0)
xor eax,eax
- 同样,eax := 0
push eax
- 推送值 0 作为未来函数调用的第一个参数
mov ebx,0x7c81cdea
- ebx 将是一个固定地址(可能退出)
call ebx
- 调用函数:exit(0)
我有一个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 逐行做什么”之外,我特别感兴趣的是:
- jmp操作,为什么我的程序会跳转,跳转到哪里?
- 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的完整流程是:
jmp 0x18
- 跳转到shellcode的最后一个代码指令call 0x2
- returns到偏移量2,并将偏移量0x1D的地址入栈pop ebx
- ebx := 来自堆栈的地址,即字符串的地址 "calc.exe"xor eax,eax
- 将寄存器归零的通用操作码:eax := 0push eax
- 推送值 0 作为未来函数调用的第二个参数push ebx
- 将指针推送到 "calc.exe" 作为未来函数调用的第一个参数mov ebx,0x7c86114d
- ebx 将是一个固定地址(可能是 WinExec)call ebx
- 调用函数:WinExec("calc.exe", 0)xor eax,eax
- 同样,eax := 0push eax
- 推送值 0 作为未来函数调用的第一个参数mov ebx,0x7c81cdea
- ebx 将是一个固定地址(可能退出)call ebx
- 调用函数:exit(0)