栈溢出入门0x07 ret2libc3&Hijack GOT

前言:

部分问题:

        有很多人发现自己跟着别人的视频做出来的东西不对,明明别人视频里可以打通,但是自己写的就打不通,即使照抄别人的write up也不行。原因:你和视频教程中师傅的OS版本不同,导致加载的libc版本不同,照抄当然不行了。比如ret2libc3中自带的一个libc.so文件在我的kali上根本识别不了,如图1,但是我自己找的一个libc6_2.38-12.1_i386.so就能完美识别。

栈溢出入门0x07 ret2libc3&Hijack GOT_第1张图片

                                                                图1

其实题目中附带的libc也是可用的,只不过是Ubuntu下的,如图2:

栈溢出入门0x07 ret2libc3&Hijack GOT_第2张图片                                                                图2

解决方法:

        接下来以Kali系统为例,将libc6_2.38-12.1_i386.so文件设置为要被加载的动态库。根据:

kali下PWN环境配置 暨pwndbg踩坑中的方法使用patchelf修改链接库(记得先备份)。修改完成后:

栈溢出入门0x07 ret2libc3&Hijack GOT_第3张图片

                                                                图3

对ret2libc的小总结:

ret2libc思路ret2libc就是控制函数的执行libc中的函数,通常是返回至某个函数的 plt 处。一般情况下,我们会选择执行 system("/bin/sh"),因此我们通常需要找到 system 函数的地址。
这里为什么不能跳转到got表呢?
    plt表里面的地址对应的指令
    got表里面的地址对应的是地址
    而返回地址必须保存一段有效的汇编指令,因此必须用plt表。

如果你提前学习过动态链接的相关知识那么就会知道,如果程序之前没有运行过某个链接过来的函数,那么plt表和got表配合才能找到这个函数的真实地址,此时got表的地址并不是该函数的真实地址。只有当这个函数运行过一次之后got表才会被填充上函数链接后的真实地址。

不管程序没有直接给出我们需要条件,我们都要想办法找到system()函数的地址和"/bin/sh"字符串的地址;当程序中没有"/bin/sh"字符串时,我们可以利用程序中某些函数如:read,fgets,gets等函数将"/bin/sh"字符串写入bss段或某个变量中,并且要可以找到其地址;对于只给出了libc.so文件的程序,我们可以直接在libc.so文件当中去找system()函数和"/bin/sh"字符串,因为libc.so文件中也是包含了这些的;最后对于没有给出libc.so文件的程序,我们可以通过泄露出程序当中的某个函数的地址,通过查询来找出其使用lib.so版本是哪一个。ret2libc3是给出了一个libc的(kali用我给的那个),虽然是给出了libc但是那是为了让实验结果一直才给的,我们要装作不知道libc是哪一个。

ret2libc1 给出了system函数和“/bin/sh”

ret2libc2 给出了system函数地址但没给“/bin/sh”

ret2libc3 什么都没给,这才是最常见的情况。

不要问我为什么不用ret2syscall和ret2shellcode,你自己去看看gadgets有int 0x80吗?你看看NX保护是不是也开启了&#x

你可能感兴趣的:(pwn,linux)