ret2libc
libc是Linux下的ANSIC的函数库。
ret2libc 即控制函数的执行 libc 中的函数,通常是返回至某个函数的 plt 处或者函数的具体位置 (即函数对应的 got 表项的内容)。一般情况下,我们会选择执行 system(“/bin/sh”),故而此时我们需要知道 system 函数的地址。
非执行堆栈
非执行堆栈是为避免堆或者堆栈的内存区域被植入恶意代码执行,当然也可以直接防止一部分内存被写入恶意代码。换句话说,这是个防止缓冲区溢出的功能。
当checksec发现NX(No-eXecute)开启后,其实就已经是非执行堆栈了,这时候就需要用到libc库。
libc是怎么来的:不再用指令覆盖EIP,直接调用libc库中我们需要的函数覆盖
思路:
1.泄露 一个调用函数的 地址
2.获取 libc 版本
3.获取 system 地址与 /bin/sh 的地址
4.再次执行源程序
5.触发栈溢出执行 system(‘/bin/sh’)
shellcode结构:
正常堆栈布局:
ret2libc执行system的堆栈布局:
具体例题可以查看[OGeek2019]babyrop的writeup。
平常的shellcode在源程序里就能找到system函数和/bin/sh,而ret2libc类型的题差别就在这里,我们需要通过libc库查找到system函数和/bin/sh在源程序中的位置,然后才能构造shellcode进行夺权,最后拿下flag。