首页
论坛
课程
招聘
【CTFHub-pwn技能树】栈溢出->Ret2VDSO如何解?
LeaMov 2023-3-10 221

保护如下
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: PIE enabled

 

分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int __cdecl main(int argc, const char **argv, const char **envp)
{
  unsigned int seed; // eax
  int inputNum; // ebx
  char buf[56]; // [rsp+0h] [rbp-50h] BYREF
  int choice; // [rsp+38h] [rbp-18h]
  int counter; // [rsp+3Ch] [rbp-14h]
 
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  counter = 2;
  do
  {
    if ( !counter )
      break;
    choice = printMenu();//打印菜单,1:调用time()函数作为rand->seed并生成一个数对比用户输入,一样则getshell
    if ( choice == 1 )
    {
      --counter;
      puts("input num:");
      seed = time(0LL);
      srand(seed);
      inputNum = getInputNumber();//getInputNumber只允许最多输入8个数字(十进制)
      if ( inputNum == rand() )//rand()生成的随机数值为10个十进制数,常规输入无法相等
        system("/bin/sh");
    }
    if ( choice == 2 )
    {
      --counter;
      puts("hello from ctfhub");
      read(0, buf, 0xD0uLL);//栈溢出,RBP+8处为__libc_start_main;RBP+0x10处为0;RBP+0x18处为main函数地址,其中main中的system调用位于<main+9A>处,末2字节为0xAD2;RSP+0x10处为VDSO基址
    }
  }
  while ( choice != 3 );
  return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
00:0000│ rsp 0x7fffffffdd00 ◂— 0xd30 /* '0\r' */
01:0008│     0x7fffffffdd08 —▸ 0x7fffffffe1c9 ◂— 0xde211509df4977e
02:0010│     0x7fffffffdd10 —▸ 0x7ffff7fc1000 ◂— jg     0x7ffff7fc1047
03:0018│     0x7fffffffdd18 ◂— 0x10101000000
04:0020│     0x7fffffffdd20 ◂— 0x2
05:0028│     0x7fffffffdd28 ◂— 0x78bfbff
06:0030│     0x7fffffffdd30 —▸ 0x7fffffffe1d9 ◂— 0x34365f363878 /* 'x86_64' */
07:0038│     0x7fffffffdd38 ◂— 0x200000064 /* 'd' */
08:0040│     0x7fffffffdd40 ◂— 0x1000
09:0048│     0x7fffffffdd48 ◂— 0x0
0a:0050│ rbp 0x7fffffffdd50 ◂— 0x1
0b:0058│     0x7fffffffdd58 —▸ 0x7ffff7c29d90 (__libc_start_call_main+128) ◂— mov    edi, eax
0c:0060│     0x7fffffffdd60 ◂— 0x0
0d:0068│     0x7fffffffdd68 —▸ 0x555555400a38 (main) ◂— 0xec834853e5894855

栈中存在vdso基址,但是没找到泄露方式,思路是填充RBP+0x8和RBP+0x10为ret并覆写RBP+0x18末2字节为0xAD2调用system,但是找不到可用的ret,vsyscall 0xffffffffff600000、0xffffffffff600400和0xffffffffff600800在靶机上无法打通

收藏
0条回答