前言


本题是Canary保护+ret2libc,根据这个题目来总结一下canary保护和ret2libc
Canary保护
(1)Canary介绍
Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。
(2)Canary原理
当函数开始执行时,会在内存某处插入一组随机数canary(一般是 寄存器fs: 0x28 处,栈中 %ebp-0x8 的位置),我们在直接进行栈溢出时canary的值就会改变,在函数退栈返回前,程序会比对栈上的canary副本和原始的canary。如果二者不同,则说明发生了栈溢出,这时程序会直接崩溃,调用__stack_chk_fail函数来终止程序


(3)Canary绕过
我们知道在进行栈溢出时Canary的值已经改变,但函数退栈返回前程序会比对Canary的值,我们可以先把Canary泄露出来,进行栈溢出时候,再把Canary的值发送,这样Canary的值就不会改变
(4)Canary特点
Canary所生成的随机数有一个非常重要的特点:随机数的第一个字节必然是 0x00。如此设计的主要目的是实现字符串截断,当我们进行泄露时遇到0x00直接就停止了,但是我们进行栈溢出时,可以多发送一个字节,使\x00被覆盖,这样我们就可以成功的将Canary泄露出来
ret2libc
(1)题目特点
进行栈溢出时,程序可能没有后门函数,可能既没有system函数,又没有”/bin/sh”字符串,我们就无法拿到shell,但是我们可以借助libc库将其真实地址计算出来
(2)解题思路
我们知道函数的真实地址 = 基地址 + 偏移地址 ,如果我们知道每次程序运行的基地址,以及每个函数的偏移地址,我们就可以计算出函数的真实地址
基地址:每次运行程序加载函数时,函数的基地址都会发生改变
偏移地址:libc库中存放的就是这些函数的偏移地址,函数真实地址的后三位不会变化,根据其最后三位借助,可以判断出libc库的版本
查询libc版本网站:libc database search
使用方法:输入函数名称和真实地址
如何计算基地址:
我们知道基地址 = 函数的真实地址 - 偏移地址
我们可以借助puts(),write()这样的函数将某个函数的真实地址打印出来(即got表中存放的地址),由于Linux的动态延迟绑定技术,我们必须选择一个main函数中已经执行过的函数,一般选择puts和write
(4)plt表和got表
PLT表(Procedure Linkage Table):PLT表用于实现函数调用的延迟绑定。当程序调用一个外部函数时,首先会跳转到PLT表中的相应条目,PLT表中的代码会检查GOT表中该函数地址是否已经解析。如果已经解析,就直接跳转到GOT表中的实际函数地址;如果尚未解析,就会触发动态链接器进行解析操作,然后更新GOT表并完成函数调用
GOT表(Global Offset Table):GOT表用于存放外部函数和全局变量的地址。GOT表在动态链接过程中起着关键作用,它允许程序在运行时查找和调用外部函数。
在这里引用一张大佬的图解释

(5)延迟绑定
定义:延迟绑定(Lazy Binding)是一种在程序运行过程中动态链接共享库函数的技术。它的核心思想是推迟对外部函数(位于共享库中的函数)的地址解析,直到程序首次调用该函数时才进行解析。这样做的主要目的是为了提高程序的启动速度,因为如果在程序启动时就对所有可能用到的外部函数进行地址解析,会花费大量时间,而且很多函数可能在程序运行过程中根本不会被调用
调用函数A的过程
首次调用:

再次调用:

(6)总结
1.找到一个main函数中已经执行过的函数,构造payload1调用puts或write将其真实地址打印出来,根据真实地址确定libc版本,以及函数的偏移地址
2.根据基地址=真实地址-偏移地址
3.根据真实地址=基地址+偏移地址算出system函数和”/bin/sh”字符串的真实地址
4.构造payload2,劫持程序,拿到shell
exp以及解释
1 | from pwn import * |
最后题目为我们提供Libc版本.so文件, 与 不提供的区别
(1)当题目不提供libc.so文件我们就需要借助LibcSearche库
1 | from LibcSearcher import * |
(2)当题目提供libc.so文件
1 | libc=ELF('libc-2.23.so') |
参考文章:
canary:canary介绍与绕过技巧_金丝雀漏洞缓解-CSDN博客
pwn入门之canary保护_pwn canary-CSDN博客
ret2libc:pwn入门:基本栈溢出之ret2libc详解(以32位+64位程序为例)-CSDN博客
exp:[【PWN · ret2libc | Canary】2021 鹤城杯]littleof-CSDN博客