整数溢出漏洞是程序开发过程中危害较大的一种漏洞,经常是PWN中各大神的突破点,利用此跳板,攻入系统,进而攻陷真个系统。此类漏洞不容易发觉,也不容易引起编程人员的注意。
近期在研究“网鼎杯2020白虎组”的比赛试题中,有一道RE逆向题目-“恶龙”,涉及到整数溢出,如利用此漏洞,可快速拿到Flag。本题解题思路有多种,详见 https://blog.csdn.net/Palmer9/article/details/106117208/,这篇博客中有详细的解释。网上大多数的解法是,动态调试程序,在断点处patch 程序运行的内存值,简单粗暴的修改 自己的战斗值(eff)。这里从另外一个角度触发,利用整数溢出漏洞,也可快速得到flag。 部分代码如下图
如下图界面,在选项3,go to shop,购买体力值时,输入大整数5999999999,导致购买体力值溢出,coins 变为了一个大整数884901895,后面直接获取得到flag。
在idea 中代码静态分析,可以看到,在12行,输入了一个整数值,直接存入了v1。
此处特别要注意有符号整数向无符号整数转换的问题。重点在于红色断点处v2为 signed int ,最大值为2^31 - 1,最小值为 -2 ^ 31,当(coin-2*v1) 小于最小值时,就会造成最小值溢出,coin的值回卷到一个很多的正数,达到溢出获取异常体力值的目的。coin的初始值为5,即
`5-2*v1 < -2 ^ 31,即v1 > (5+2^31)/2`,v1 > 2.5+2^30即可。输入最小整数值(1073741824+3)即可获取flag,如图