我有两个C程序。一个是shellcode,另一个是易受攻击的程序。
我想更改返回地址而不用缓冲易受攻击的程序。
例如: -
__asm__("movl $shellcode, 4(%ebp)");
但是这个方法对我来说不起作用,我尝试在linux下使用gdb运行易受攻击的程序并将shellcode重定向到它(gdb) run vuln < shellcode
但是eip或ebp永远不会改变。
有人可以看看我的shellcode程序,看看错误在哪里。
shellcode程序
#include <stdio.h>
#include <stdlib.h>
void shellcode() {
__asm__(".byte 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90"); /* you may put your shellcode here */
printf("hey guyz!\n");
exit(0);
}
void bang(int val) {
__asm__("movl $shellcode, 4(%ebp)");
}
int main() {
bang(0);
}
易受攻击的程序
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *string) {
char buffer[1024];
strcpy(buffer, string);
return 1;
}
int main(int argc, char *argv[]) {
bof(argv[1]);
printf("Done..\n");
return 1;
}
答案 0 :(得分:0)
您要实现的目标称为Stack buffer overflow。
基本上, 你写入堆栈的字节比你应该多,并覆盖返回地址。
当你输入一个函数时,堆栈看起来像这样(简化):
+----------------+
| Buffer[0] |
| Buffer[1] |
| . |
| . |
| . |
| Buffer[1023] |
| Return Address |
+----------------+
因此,您必须写入至少1025个字节才能到达返回地址。 一旦你这样做并且函数返回,它将尝试返回你放在那里的任何值。
以下是一个例子:
说我们有一个名为“exploit.txt”的文件,里面装满了32个A:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
并且易受攻击的程序如下所示:
#include <stdio.h>
#include <stdlib.h>
void func(FILE *f)
{
long size;
char c[12]; // You should only write 12 bytes here
fseek(f, 0, SEEK_END);
size = ftell(f);
rewind(f);
fread(c, 1, size, f); // no bounds checking
}
int main(int argc, char **argv)
{
FILE *f = NULL;
if(f = open("exploit.txt", "r"))
{
func(f);
fclose(f);
}
printf("done.\n");
return 0;
}
当你运行程序时,你会在地址0x41414141崩溃,因为读取文件导致溢出并且返回地址被覆盖。
在这种类型的漏洞利用中,您的shellcode将在开头具有特定的返回地址,
指向易受攻击的可执行文件中的某个位置,而不是跳回到堆栈上的shellcode(jmp esp
)。
但请注意,最有可能的是,这不适用于现代编译器,因为他们添加了security checks来防止这种情况, 因此,如果您想尝试它,则必须在编译器中禁用这些选项。
您可能还想了解有关Buffer Overflow
的更多信息希望有所帮助!