2012-03-30 60 views
0

这个问题与前一个问题Previous QuestionLinux的缓冲区溢出返回到libc中

前一个问题的后续行动,通过改变可执行文件的权限与execstack解决。我的新问题围绕另一个实现绕过堆栈执行保护。这使用return-to-libc并且涉及针对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; 
} 

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

+0

这是什么问题? – 2012-03-31 00:01:54

+0

@OliCharlesworth为什么我失去了这些特定的字节。 – Blackninja543 2012-03-31 00:07:49

回答

3

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

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

+0

这是问题,但我遇到了一个新问题。还有尾部'\ x00'字节,并且在该字节后面有额外的代码。有关解决'stycpy()'空字节问题的任何建议。 – Blackninja543 2012-03-31 00:41:59

+0

@ Blackninja543:解决这个问题的方法是确保您的有效负载没有除最后一个字节之外的任何空值。 – caf 2012-03-31 09:19:49