简单的栈溢出_hello_elf
原文地址:https://hvnt3r.top/2018/09/%E7%AE%80%E5%8D%95%E7%9A%84%E6%A0%88%E6%BA%A2%E5%87%BA-hello-elf/
最近哥们问了我一道PWN题,觉得比较有代表性而且难度较低,就记录下来以作栈溢出的示例,仅从新手角度分析,大牛绕过
题目地址:https://pan.baidu.com/s/1Gd6u_-pRWmPsRJdlnnNYKg
0x00 基本知识
首先,要进行栈溢出的漏洞利用要理解栈的基础结构以及在计算机内的存储方式,之前就有很多大佬写过相关的文章,我也没必要造轮子,就把链接放在这里吧,我是链接,这个是百度百科上比较通用的解答,如果觉得不清楚还可以自己查阅其他的文章
0x01 起手第一步
首先一般我拿到一个二进制文件的时候会先用file
命令看一下文件的类型:
☁ 1 file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=547379e1b7bd695a7546d2a3321e199c0474dfa9, not stripped
这里显示这是一个32位的ELF文件,其实对于新手来说IDA_Pro的一键f5还是挺方便的,我们先把文件放到IDA里看一下:
IDA的左侧显示了一些函数的信息,双击函数后再按F5
键使IDA显示出伪C代码,这里说是伪C代码是因为这些代码严格意义上不算是C代码,只是IDA为了使程序显示更接近我们的逻辑顺序而显示的一种接近于C语言格式的代码,如果可以通过自己的判断来修复一些伪C代码中的逻辑或者变量名称,可以使得代码接近于源代码,但是我们这道题不涉及修复的知识。
随便翻看一下这些函数的内容,并在脑海中大致建立一个程序的逻辑框架,看到一个read函数,不知道此函数的作用怎么办,很简单,Linux下自带命令man
可与查看函数的手册
在Linux终端下输入命令:
man read
此时终端会打印出关于read函数的信息:
内容很多,感兴趣的同学可以自己敲一下试试,而我们目前只需关注一下信息:
NAME
read - read from a file descriptor
SYNOPSIS
#include <unistd.h>
ssize_t read(int fd, void *buf<