Linux缓冲区溢出返回到libc

Linux缓冲区溢出返回到libc,c,linux,security,C,Linux,Security,这个问题是上一个问题的后续问题 通过使用execstack更改可执行文件的权限,解决了前面的问题。我的新问题围绕另一个绕过堆栈执行保护的实现。这使用并涉及对system()的地址执行/bin/sh 我目前正在使用以下代码: #include <stdio.h> void func(char *buff){ char buffer[5]; strcpy(buffer, buff); printf("%s\n", buffer); } int main(i

这个问题是上一个问题的后续问题

通过使用
execstack
更改可执行文件的权限,解决了前面的问题。我的新问题围绕另一个绕过堆栈执行保护的实现。这使用并涉及对
system()
的地址执行
/bin/sh

我目前正在使用以下代码:

#include <stdio.h>

void func(char *buff){  
    char buffer[5];
    strcpy(buffer, buff);
    printf("%s\n", buffer);
}

int main(int argc, char *argv[]){
    func(argv[1]);
    printf("I'm done!\n");
    return 0;
}
#包括
void func(char*buff){
字符缓冲区[5];
strcpy(缓冲区,buff);
printf(“%s\n”,缓冲区);
}
int main(int argc,char*argv[]){
func(argv[1]);
printf(“我完成了!\n”);
返回0;
}
当我需要将
func()
的返回地址溢出到
0x00167100
地址时,就会出现问题。执行缓冲区溢出时,我使用的参数是
$(echo-e“\x00\x71\x16\x00”)
。然而,问题是在从我的参数中删除
\x71
之前最不重要的
\x00
。事实上,我可以使用
\x00\x00\x00\x00\x00\x00\x00…\x71\x16\x00
,传入的参数仍然是
\x71\x16\x00
。最终的结果是在像
0x080016771
这样的地址应该是
0x00167100
strcpy()
在第一个空字节处停止复制之前重写地址。这意味着您必须使用至少最后三个字节为非空的地址

也许您可以跳过目标函数的第一条指令。

strcpy()
在第一个空字节处停止复制。这意味着您必须使用至少最后三个字节为非空的地址


也许您可以跳过目标函数的第一条指令。

@OliCharlesworth我为什么丢失这些特定字节。@OliCharlesworth我为什么丢失这些特定字节。这就是问题所在,但我遇到了一个新问题。仍然有尾部
\x00
字节,在该字节之后还有额外的代码。任何关于解决
stycpy()
null字节问题的建议。@Blackninja543:解决这个问题的方法是确保您的负载除了最后一个字节之外没有任何null。这就是问题所在,但我遇到了一个新问题。仍然有尾部
\x00
字节,在该字节之后还有额外的代码。关于解决
stycpy()
null字节问题的任何建议。@Blackninja543:解决这个问题的方法是确保您的负载除了最后一个字节之外没有任何null。