栈溢出实验


前言

由于不想做点鼠标的猴子,于是就自己尝试一下利用,结果拐弯就是一坑,这不是在踩坑的路上,就是在坑里摸爬滚打,太艰难了,幸亏有卓佬和晨佬指点,不然还在坑里

栈溢出原理

程序内存栈是从高地址往低地址分配内存的,正因如此,当程序在栈中,某个变量写入的字节超过了这个变量本身所申请的字节数时,会改变其他相邻变量的值,轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。

利用

代码

下面栈溢出实验的代码

#include <stdio.h>
void success() { printf("You Hava already controlled it."); }
void vulnerable()
{
  int val = 0;
  char s[10];
  gets(s);
  if (val == 1)
    printf("hunzi\n");
}
int main(int argc, char **argv)
{
  vulnerable();
  return 0;
}

编译生成exe后进行计算偏移

od分析

使用od打开该exe文件,下面为主要汇编代码,在主函数打断点后运行
在这里插入图片描述
在输入字符串后暂停,可以看到0060FEFC对应的00401400为vulnerable函数结束时跳转的地址。0060FEEC对应的是变量val的值,0060FEF8为vulnerable函数的基地址(EBP),从0060FEE2后存入用户输入的字符串,由于gets没有限制用户输入长度,所以可以构造输入来达到覆盖变量的值和函数返回地址
012345678916进制字符串为30313233 34353637 3839
在这里插入图片描述
在这里插入图片描述

实验

代码

由于在终端输入,x等字符都会算作一个单独字符,所以我们使用重定向来解决,先用c写一个简单payload程序

#include<stdio.h>
int main()
{
    int index = ; //填充字符
    int i;
    for (i = 0; i < index; ++i)
    {
        printf("A");
    }
    char a[100] = ""; //填充数据
    printf("%s", a);
    return 0;
}

修改变量

由于上面的代码的有一个变量val,我们就修改该变量。通过上面的内存栈图可以看到用户输入的字符串后面就是val变量的值,也就是说,我们需要先填充10个字符后紧跟上我们要改的数值,内存中采用的是小端存储,所以00000001在内存的形式为\x01\x00\x00\x00
在这里插入图片描述

修改返回地址

根据上面的计算,到返回地址需要填充26个字符,success函数的地址为004013B0,修改payload代码数据,生成exe
在这里插入图片描述

总结

刚开始用vs搞,死活无法成功,后来发现这得用gcc编译器,vs的编译器似乎有某种机制,不按正常套路出牌,把我还搞蒙蔽了,还有一些保护机制也要进行关闭,否则也没有办法成功,建议大家在linux上尝试,还有strcpy、strcmp等函数也存在这样的漏洞

大家可以关注菜鸡的公众号,有什么好想法也可以让我学习一下,有什么问题可以一块解决,由于二维码违规,下面是base64编码的文字

5b6u5L+h5YWs5LyX5Y+34oCc5a6J5YWo5re35a2Q4oCd77yM5Y+v5Lul55So5b6u5L+h5pCc5LiA5pCc77yM5q2j5Zyo5a6M5ZaE5LitLi4uLi4u

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安全混子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值