缓冲区栈溢出 Stack0

需要材料:

1.https://www.vulnhub.com/entry/exploit-exercises-protostar-v2,32/

镜像文件

2.https://github.com/hellosputnik/exploit-exercises/tree/master/Protostar
源码

背景知识:

1.c/汇编/gdb/python/逆向/linux – 使用及对应知识

开始之前:

1.安装protostar虚拟机

2.使用帐号密码user:user进行登录

3.进入/opt/protostar/bin 程序代码目录中

4.切换执行终端shell为bash 执行/bin/bash

缓冲区栈溢出  Stack0

5.查看C代码,这里需要修改modified变量值为非0从而打印 “you have change the ‘modified’ variable\n”

缓冲区栈溢出  Stack0

开始:

1.使用gdb进入程序,设置显示汇编指令为英特尔类型,设置main函数为断点

缓冲区栈溢出  Stack0
  • push ebp #推入栈中
  • mov ebp,esp #把esp内存地址赋值给ebp
  • and esp,0xfffffff0#把esp和0xfffffff0相对比的地址不为0的设置为0
  • sub esp,0x60 #esp减去0x60(十进制96)
  • mov DWORD PTR [esp+0x5c],0x0 #这里即是modified变量被赋值的地方

2.

  • 重新查看内存地址和反汇编指令
  • 删除所有断点
  • 在gets函数被调用的地址处设置断点 #内存地址:0x0804840c
  • 重新运行程序 # r
  • 使用x/i $eip查看下一个指令是否是调用gets函数
  • 使用ni执行下一个汇编指令,随后输入字符A(十六进制为\x41)
  • 查看栈地址后24字(一个字4字节)地址存储内容
  • 可以从左边内存地址0xbffff750行最右边存在0x41414141的存储内容,存储内存地址是0xbffff75c
  • 查看上面提到的esp+0x5c被赋值为0的内存地址,可以看到数字0的存储地址为0xbffff79c(即在我们之前查看过的后24个esp存储内容的最右下角)
缓冲区栈溢出  Stack0

3.计算存储A字符的地址到modified变量地址存储的地方 4*4+1乘17=68,去除modified变量的存储地址的4个字节.刚好和buffer数组变量中的64个存储数量相同

  • 重新设置断点输入68个字符A,可以查看modified变量的存储地址已经被\x41溢出
  • 使用c gdb短指令继续执行程序,获得成功输出
缓冲区栈溢出  Stack0

4.在终端进行尝试(gets函数无法接收参数输入,可以通过管道重定向获得输入数据流)

缓冲区栈溢出  Stack0
  • 可以看到输入65,68长度字符都可以成功溢出,而64字符长度的输入依然输出”Try again?”

原创文章,作者:absec,如若转载,请注明出处:http://absec.cn/?p=703

发表评论

登录后才能评论

联系我们

010-61943626

在线咨询:点击这里给我发消息

邮件:marketing@anbai.com

工作时间:电话:周一至周五,10:00-18:30,节假日休息,邮件随时发哦~