此问题是对上一个问题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
。
答案 0 :(得分:3)
strcpy()
停止在第一个空字节处复制。这意味着您必须使用至少最后三个字节为非空的地址。
也许你可以跳过目标函数的第一条指令。