Linux缓冲区溢出返回libc

时间:2012-03-30 22:45:45

标签: c linux security

此问题是对上一个问题Previous Question

的跟进

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

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

#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;
}

当我需要将func()的返回地址溢出到地址0x00167100时,我的问题就出现了。当我执行缓冲区溢出时,我使用的参数是$(echo -e "\x00\x71\x16\x00")。然而,问题是在\x00从我的论点中删除之前的最不重要\x71。实际上我可以使用\x00\x00\x00\x00\x00...\x71\x16\x00,传入的参数仍然是\x71\x16\x00。最终结果是覆盖地址之前的覆盖地址0x08001671,而它应该是0x00167100

1 个答案:

答案 0 :(得分:3)

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

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