本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题
此处我将文件命名为pwn
checksec pwn 查看一下保护机制

可以看到这是一个64-bit的文件,NX保护开启
将文件拖入ida64,按F5将汇编代码转换成c语言代码,得到

可以看到然我我们输入一个值nbytes,如果有符号整型nbytes<=10就可以执行read(0,&buf,(unsigned int)nbytes)。所以我们需要(signed int)nbytes小于等于10,同时(unsigned int)nbytes足够大,才可以发生栈溢出,覆盖返回地址。
signed int范围:2**31~2**31-1
unsigned int范围:0~2**32-1
我们如果让nbytes=2**31,那么(signed int)nbytes就会等于-2**31,(unsigned int)nbytes就会等于2**31,正好满足我们的要求
返回虚拟机
ROPgadget --binary pwn --only "pop|ret"

得到ret_addr = 0x400599
nano exp.py开始写攻击脚本

第一次发送2**31,整数溢出
payload:填充0x10+8的垃圾数据至return address;ret_addr用于栈对齐;0x400726为backdoor函数的地址,用于覆盖返回地址,获得shell
保存退出
python3 exp.py
cat flag

此题完