bjdctf_2020_babystack2(整数溢出)
bjdctf_2020_babystack2(整数溢出)
拿到题目,我们先checksec一下:
清楚的看到,这道题目,是没有开启canary保护的,也就是说,这是一道栈溢出的题目。
我们使用IDA进行反编译:
可以看到整个题目的一个大致流程,让我们输入一个数字,这个数字表示我们可以向&buf地址中写入数据的大小,但是前面有一个验证,我们输入的数字大于10,程序就会自动退出,IDA显示,buf变量的大小为0x10字节,我们想要造成栈溢出,就要绕过这里的if函数,使我们写入的数据能够更多,从而覆盖返回地址。我们可以看到,我们读入的是一个signed int ,也就是一个有符号的整数,而read函数的第三个参数传入的类型是size_t,意思就是无符号整数。
我们可以看看下面的这张图片:
如果我们传入-1(即0xffffffff),在进行if判断的时候,这时我们的nbytes变量作为有符号的整数,被视作-1小于10,成功的绕过了if函数,当函数执行进入read函数的时候,此时,nbytes变量被当作无符号整数,最高位不再代表正负,此时大小为:4294967295(0xffffffff),此时我们能够写入的数据就变的非常的大,就可以写满buf并覆盖返回地址,进行栈溢出。下面是我们要溢出的函数:
使用gdb,将断点打在main函数快要结束的地方(0x400826)(leave),去验证我们到底要覆盖多少字节,才可以覆盖到返回地址:
我们输入10和AAAAAAAAAA,可以看到,此时stack的排布:
可以看到,”A”写入的起始地址距离__libc_start_main+243大小为:0x18,脚本如下:
1 | from pwn import |