Glibc PWN 0x3 保护 & PLT表 & GOT表

Glibc PWN 0x3 保护 & PLT表 & GOT表

本次将主要介绍Linux下程序的保护,plt表和got表,之后将以CTF-Wiki中的基础ROP为例实践解决问题

0x1 基本概念

1
2
3
4
5
6
7
➜  checksec start
[*] '/Users/xuanxuan/Desktop/pwnable/start/start'
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
  • gcc为程序提供了许多保护机制,主要包括:

    1. CANNARY保护

      • 作用:检测栈溢出
      • 关闭:-fno-stack-protector
      • 启用(只为局部变量中含有 char 数组的函数插入保护代码): -fstack-protector
      • 启用(为所有函数插入保护代码): -fstack-protector-all
    2. FORTIFY保护

      • 作用:限制格式化字串漏洞
      • 关闭:-D_FORTIFY_SOURCE=0
      • 开启(只会在编译的时候检查):-D_FORTIFY_SOURCE=1 -O1
      • 开启(强检查):-D_FORTIFY_SOURCE=2 -O2 没有加-O2参数的话是不会开启强检查的,需要在编译的时候加上这个参数
    3. NX保护

      • 作用:堆栈不可执行
      • 关闭:-z execstack
      • 开启:-z noexecstack
    4. PIE保护

      • 作用:地址随机化
      • 关闭: -no-pie
      • 开启: -pie -fPIC
    5. RELRO保护

      • 作用:GOT表不可写

      • 关闭:-z norelro

      • (Partial RELRO)开启(部分):-z lazy

        • got表不可写,got.plt可写

          即 只有有plt表对应的got表可写

      • (Full RELRO)开启(完全):-z now

        • got表,got.plt表不可写

          即 所有got表均不可写(不包括hook函数)

    6. 去除符号表

      • 作用:增加逆向难度
      • 启用:-s

0x2 plt表和got表

  • 简单介绍

    • 一般涉及到plt表和got表的题目都是采用延迟重定位的,简单理解就是got表是一个存储着外部库函数的表,而plt表则由若干代码片段组成,每个片段指向got表中的一个函数
    • 当某函数被第一次调用时,函数调用会跳转到plt表,plt表会跳转到got表,但got表中此时没有该函数的地址,因此经过一系列处理后,需要对被调函数进行地址解析和重定位,之后会将得到的函数地址写在got表中,下次再用到时就可以直接调用
  • 详细介绍

    函数第一次调用:

    img

    • 第一步由函数调用跳入到PLT表中

    • 第二步PLT表跳到GOT表中

    • 第三步由GOT表回跳到PLT表中,这时候进行压栈,把代表函数的ID压栈

    • 第四步跳转到公共的PLT表项中

    • 第5步进入到GOT表中,然后_dl_runtime_resolve对动态函数进行地址解析和重定位(猜测在第三步时压栈的函数ID会被作为参数参与解析和重定位)

    • 第七步把动态函数真实的地址写入到GOT表项中,然后执行函数并返回。

    • dynamic段,link_map和_dl_runtime_resolve的含义

      • dynamic段:提供动态链接的信息,例如动态链接中各个表的位置
      • link_map:已加载库的链表,由动态库函数的地址构成的链表
      • _dl_runtime_resolve:在第一次运行时进行地址解析和重定位工作

    第二次调用

    img

    • 可以看到,第一步还是由函数调用跳入到PLT表,但是第二步跳入到GOT表中时,由于这个时候该表项已经是动态函数的真实地址了,所以可以直接执行然后返回。

参考:

https://xuanxuanblingbling.github.io/ctf/pwn/2019/08/30/start/


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!