最近开始入坑系统安全大坑,调转方向开始了解pwn,那就要补一些那少得可怜的底层基础啦
- 先学几个单词:
- exploit:用于攻击的脚本与方案
- payload:攻击载荷,是目标进程被劫持控制流的数据(精心构造的恶意数据,目标进程执行后就会触发这个漏洞)
- shellcode:调用攻击目标的shell的代码
- 还有一些工具
linux下的C语言编译
C语言在pwn里面有着举足轻重的地位,C往往是计算机科班学习的第一门语言(自学的就看自己啦哈哈),C上可写高级语言,下可操作硬件,同时在pwn中有40%的漏洞是由C/C++编写的,是非常重要的一部分。
命令观察
在kali的命令行中,如图进行测试实验
通过vim创建并编写C语言文件,gcc进行编译,之后可以看到生成了a.out文件,这就是linux里面的可执行文件了。后面要执行的时候注意要用"./a.out",直接写“a.out”的话会被当成命令而显示未找到命令
可以加上‘-o’参数指定输出文件名:
拿到pwn先运行,看看他是干啥的,再去反编译等内容
打印一下二进制程序:
这实际就是可执行文件了
再查看一下他的格式
显示是ELF,64位,小端序(LSB)的,是linux下的可执行文件的格式。
linux提供了读ELF文件的命令:readelf
可以用:readelf -a filename | less
里面也会记录所用到的一些函数
- nm可以查看运行的一些过程,可以看有哪些符号表,用到了哪些函数
- hexdump可以查看其十六进制
hexdump question_1_x64 | less
- ldd:查看里面用到的库函数的位置
file可以看到用了哪个链接器,但是ldd可以把用到的东西全部显示出来
如:下面路径下就会有一个libc.so.6
- objdump:可以将程序反编译成汇编指令
命令:objdump -d filename | less
这是APT模式下的汇编指令,要是想看Intel的汇编指令,可以加参数-M intel:objdump -d -M intel filename | less
编译过程
gcc命令可以对C语言文件进行编译,但实际上这条命令为我们隐藏了很多中间过程,具体过程如下图所示
- 首先要进行一个预处理,不过这对pwn来说不用太关心,这之后就会得到预处理过后的C语言代码
- 编译:C语言代码经过汇编转化为汇编代码(此时起作用的是一个汇编器),此时还是给程序员看的汇编代码,而不是给机器看的机器代码(机器只能读懂机器码)
- 汇编:由汇编代码生成机器码,之后生成的就是ELF文件了(此时这个文件就已经是个目标文件而且保存的是机器码,但是此时还并不是一个可执行文件,还需要进行链接,因为当前她只包含了C语言代码中自己写的那部分文本,其调用的功能是由系统中的链接库实现的,需要链接)
- 链接:将编译后的文件链接成可执行文件
可执行文件
概念
- 狭义:CPU可以对文件中的数据读取并解析执行,即问津中的数据是机器码的文件
- .out .exe .dll .so
- 广义:文件中的数据是可执行代码的文件
- .out .exe .sh .py
一些命令
- file ldd nm hexdump
- objdump -d -M intel
- readelf -a
- gdb
- socat tcp-l:8888,fork exec:./a.out,reuseaddr
其中较常用的是file、ldd,比较重要的是gdb