我知道有很多关于如何编写缓冲区溢出的教程,但仍然无法编写自己的。
以下是我想破解的C代码:
#include <stdio.h>
#include <stdlib.h>
static int x = 8;
void prompt(){
char buf[100];
gets(buf);
printf("You entered: %s\n", buf);
}
int main(){
prompt();
return 0;
}
void target(){
printf("Haha! I made it!\n");
exit(0);
}
我的目标是通过缓冲区溢出漏洞来执行target()函数。 通过反复试验,我发现获得分段错误所需的最小字符数为108.(因此107个字符不会导致seg错误) 我已经反汇编了二进制文件,发现目标可执行文件位于地址0x08048e7f
我已经翻转了字节顺序以补偿字节序。 - &GT; 0x7f8e0408 然后我将十六进制转换为二进制,然后转换为ASCII,获得:&amp; #3 8 1; (忽略空格,stackoverflow最初没有正确显示) 之后,我插入了前107个字符,然后是Ž
因此,我的攻击字符串是:iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii 这仍然给我一个分段错误。 我这样编译:
gcc ./vuln_program.c -fno-stack-protector -z execstack -static -o vuln_program
并事先禁用了保护措施:
sudo sysctl -w kernel.randomize_va_space=0
我使用的是32位Ubuntu虚拟机。
有什么想法吗? 谢谢。
编辑: 我刚刚意识到我在这个网站上的输出被视为奇怪的字符。 如果你看到一个奇怪的Z,它真的是1)&amp; 2)#3)3 4)8 5)1 6);按照确切的顺序