入门ret2libc

这个真的 没什么过程可言了 我把理论吃了一遍又一遍 一开始的ldd 到现在终于解出一道ctfshow pwn3 的简单题了
ret2libc 做题步骤****
1.泄露函数地址
2.找到libc版本
3.计算libc基址
4.找到我们需要的函数在libc中的地址
5.计算在文件中的相对地址
6.payload****
接下来一步步拆解知识原理
在这之前先说为啥要这样写
第一,函数开启nx保护,那我们就不能靠自己来写shellcode来获得shell
第二,函数中没有我们可以直接利用的system函数,
第三,文件大多都是调用着动态链接库的,那些库里都有我们需要的函数,平常的ret2text是肉眼可找的 这个就是多了前几步,并没有多难理解。
一、首先泄露函数地址 以(puts函数为例)
这里就是延迟绑定机制 plt表和got表共同作用的结果
函数在一开始运行时 会根据plt表这个存放我们需要调用的函数的地址(就好像我们初到图书馆找书 要根据指引一步步走到那本书面前)
(这些书在指定的图书馆的位置是一定的,不会变,那我们自己记住这个位置,下一次就不需要一步步跟着指引找,看着自己的小本本或靠自己记忆就能直接找到了)这个就是got表的作用
他存放了那个函数内存动态地址(这个地址每次运行后地址都会改变)!!!写到这块我想到一个问题:既然它会一次次变化 那构造两个函数时调用了两次 第一次的怎么能用到第二次的哪?!!!
哎呀我去!!!!我们用它又不是在第二次用的到他 它的作用只是为了找 调用的libc库以及libc的基址。当然ASLR这个东西是每次打开终端时发生的改变 一次脚本,一次链接就不需要想那么多了
总而言之言而总之 泄露函数,就是靠的got表 先填充覆盖到跳转地址 直接调转plt随后自动到got表 完成一次调用,接着重新执行一次 就是pwnme这个函数 将got表填入 这时就可以泄露got表中的地址啦。

但是这块需要注意 这里有三个puts函数里面都有内容 我们需要将里面‘清空’就是脚本中的 recvuntil 以及recvline操作 要不然泄露的 本身就是puts(这里面的内容哦)
二、剩下的似乎也就没什么好说的了,通过泄露的函数的后三位找libc版本 当然有在虚拟机中专门干这个的一个 工具吧 LibcSearcher 或者从你电脑上的网页搜https://libc.blukat.me/?q=puts%3A360&l 这个一般会出现不止一个版本 当然一个个试一下就好
我这个到倒数第二个才找到 当然细心点 有的那三个函数地址其实是一样的。找到后后面的也确实就跟平常的ret2text一样了。。
浙公网安备 33010602011771号