简单栈溢出实验

本文介绍了如何在Linux环境下,通过C语言编程、GCC编译,利用GDB进行代码注入和反编译的过程,包括安装必要的工具、关闭地址随机化、查找函数地址并修改输入数据以触发特定函数执行。
摘要由CSDN通过智能技术生成

实验原理

实验代码

预先准备:下载一系列东西例如gcc,vim编辑器等

详情可参考如何在 Linux 上安装 C 和 GCC 编译器?_安装c编译器(安装命令:sudo apt-get instal gcc)。安装文本编辑器(安装命令s-CSDN博客

创建StackOverflow.c文件

先贴StackOverflow.c的代码内容

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


char input[] = "11112222333344445555666677778888" ;               

void inject()
{
    printf("*****inject success*****\n");
    exit(0);
}

void func_call()
{
    char param[16];
    //printf("inject address:%p\n", inject);
    //printf("param address:%p\n", param);
    //printf("input address:%p\n", input);
    strcpy(param,input);  
}


int main(int argc,char**argv)
{
    func_call();
    printf("main ...\n");
    return 0;
}

运行完后在终端执行

sudo apt-get install gcc-multilib

代表支持交叉编译cross-compiling

sudo sysctl -w kernel.randomize_va_space=0

代表关闭进程空间地址随机化功能

使用

gcc -Wall -g -o StackOverflow StackOverflow.c -fno-stack-protector -z execstack -m32 

编译c,并输入 ./StackOverflow进行运行

此时可能会出现main ...或者segmentation fault 等字样。我们想办法运行inject函数

在终端输入 gdb StackOverflow进行反编译

输入disas func_call 和disas inject分别查看两者的位置,找到inject第一行的地址位置

先运行disas func_call

输出后查看开始与结尾,开始为起始地址,ret为返回地址

其中带有(gdb)的为输入的部分,这里+50中的50为第二列ret对应的<+50>

而后运行x/x $esp(但我不知道为啥是这个)

查询inject,disas inject,出现了inject的地址

然后将input[]的内容中的8888改为这个地址,例如图中即改为“1111222233334444555566667777\xed\x61\x55\x56”,各个机器地址不一样,更改数值也不一样。

改完后再次编译运行即可显示inject success

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值