怎么用代码的Stack overflow黑进别人系统-初级篇
1 前言
学了这么多年的编程语言,什么python, C, C++, JAVA, PHP,MATLAB都有接触除了if, else用的比较溜,其余的没发现有什么见长。代码只有数量没有质量,一段好的代码应该是安全的,高效的,今天我就结合做过的项目聊聊怎么利用Stack overflow在Linux C语言的环境下进行代码渗透。
2 基础工具
- OS: Linux Ubuntu, 更推荐Linux Debian
- Compiler: GCC 4~5
- Debugger: GDB
- IDE: Eclipse, Vim, etc都可以
- Optional: VM ware 或Virtualbox 虚拟机,如果在Windows上运行
3 代码示例,Exploit讲解
上代码,代码的内容基本可以跳过,后面解释,其实就是一个排序。
这段代码意思就是对你输入的一串数字或者字符文本进行处理,输入的长度自己决定,当然用户也可以手动输入内容,这都是属于一类问题。这种代码可以说在日常的码农工作里非常常见了,接下来我将举例说明利用这段代码的任意输入的漏洞进行渗透,在在这之间我会做一些准备工作。
首先说一下堆栈,其实就是stack, heap由于是随机分配的chunk,就不说了。当代码从主函数前往子函数之前,主函数会有一系列保护现场的措施,这个我们也可以跳过,我主要说的是可以接收用户输入的部分,在这个例子中就是我们的子函数,子函数里的常量去数据区,变量去栈区,是按照先进后出的原则进行的,细节就是在这里,在进栈的时候,栈寄存器会自己做一些处理,就是今天的重点内容,ESP, EBP, EIP。通过巧妙的控制用户输入,使EBP, ESP沾满padding1的位置,然后使EIP,就是函数的返回地址,返回到任意一个我们想返回的地址,当然就不是主函数的保护现场的地址了,为了做点有趣的事情,我们准备进入system call的地址,请求计算机做点系统级的事情,比如关机啊,发出声音啊,运行一些系统级的指令什么的都行。这里我们以进入Linux shell terminal为例。
接下来我们要做的事情就是计算padding,看看用户输入多少才能override到EIP,就是函数的返回地址,然后如果我们找到了之后,里面的地址放什么,这里我们放的是system call的地址,然后system call请求了,请求之后的动作的返回值在padding里面,这里我们用的是/bin/bash 所以可以不用管这个值了,最好不要为空就行。接下来就是找一下Linux terminal的地址了,以上说的所有地址都可以在GDB中找到在GCC编译之后的可执行文件里。
直接上图和GDB调试过程,打个断点,多步运行,查看堆栈寄存器的地址,因为我们马上要在这些地址里面重写我们自己想要的值。
查找Linux bash terminal 发地址
代码的编译和执行:
你可以看到,我们从程序里面进入到了系统的bash terminal了,渗透成功!
4 Reference
[1] “Return2libc”, June, 2020. Accessed on: June. 20, 2020. [Online]. Available: https://blog.csdn.net/qq_37414405/article/details/84928128
[2] “return to lib_c buffer overflow exercise issue”, Oct. 2019. Accessed on: May. 30, 2020. [Online]. Available: https://stackoverflow.com/questions/19124095/return-to-lib-c-buffer-overflow-exercise-issue
[3] S. El-Sherei, Return-to-libc, May. 2026. Accessed on: May. 24, 2020. [Online]. Available: https://www.exploit-db.com/docs/english/28553-linux-classic-return-to-libc-&-return-to-libc-chaining-tutorial.pdf