购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.4.2 基于LIEF对.got.plt表的攻击举例

(1)被测目标应用源码如Listing 3.1所示。

Listing 3.1 基于LIEF修改.got.plt表信息的被测目标应用源码crackme.c

说明:

①用户的输入需要首先和0x5C进行异或操作,然后和指定的字符串进行比较,通过则输出“You got it!!”。

②正确的用户输入是“Damn_YoU_Got_The_Flag”。

攻击说明:

(2)攻击目标。通过修改目标应用程序的.got.plt表的内容可以实现钩子(Hook)函数,改变程序的运行流程,实施控制流劫持攻击,如图3.1所示。

说明:

①目标应用程序在调用puts()函数时,正常流程会先跳转到.plt表,然后经由.got.plt表跳转到正式的函数代码处执行,如图3.1左侧所示。

②当puts()函数的.got.plt表被修改后,调用puts()函数时会跳转到钩子函数后的puts@hooked函数执行,如图3.1右侧所示。

图3.1 修改目标应用程序的.got.plt表以实施控制流劫持攻击

(3)钩子函数源码如Listing 3.2所示。

Listing 3.2 基于LIEF修改.got.plt表信息的钩子函数源码hook.c

说明:

①钩子函数的源码必须是位置无关的,即编译时需使用-fPIC或-pie/-fPIE选项。

②不能使用外部函数,如libc.so等,因此在编译时需要使用-nostdlib-nodefaultlibs选项。这里使用_write()函数实现输出信息的功能,因此最终的编译命令如下:

(4)hook脚本文件源码如Listing 3.3所示。

Listing 3.3 基于LIEF修改.got.plt表信息的hook脚本文件hook-pltgot.py

说明:

①lief.parse()函数:是LIEF的分析对象,可根据输入的文件名创建一个ELF.Binary对象,实现对二进制文件和库的分析,这里分别是“crackme.bin”和“hook”。

②hook.get_symbol()函数:根据指定的名字获取对应的符号信息。

③patch_pltgot(’memcmp’,my_memcmp_addr)函数:将符号memcmp修改为my_memcmp_addr。

(5)Makefile文件的源码如Listing 3.4所示。

Listing 3.4 生成crackme.bin和hook的Makefile文件 0ILl2OKFAKK72Htk+kM7O1vPdfELSPbNk8B9Idn8u4ODyGUfvJ2yA2aDlwNn3piV

点击中间区域
呼出菜单
上一章
目录
下一章
×