[PWN]新手入门第一篇章介绍
pwn 介绍
1、pwn: 破解,利用成功(程序的二进制漏洞)
2、攻破(设备,服务器)
3、控制(设备,服务器)
linux下的可执行文件是ELF
exploit用于攻击脚本的脚本与方案
攻击载荷,是目标进程被劫持控制流的数据
shellcode调用攻击目标的shell脚本
一切的编译型语言都可以生成二进制文件
在vim中查看一个文件的二进制格式是在末行模式输入:%!xxd
此时你看到的二进制的值都是在ascii范围内的,因为它是文本文件
,文本文件的所有值都是ascii码值
通过gcc编译c程序文件中间经历了很多过程,但做PWN的时候我们只关心中间的两个步骤:
c程序源代码---------->汇编程序代码文件----------->目标文件(链接文件)--------------->可执行程序文件(目标文件链接成可执行文件)
gcc -S test.c # 会把C语言文件编译成汇编代码文件test.s
gcc test.s #就是通过gcc把这个汇编文件再编译成二进制执行文件 a.out
当我们通过vim来查看a.out的二进制执行文件的内容的时候,会出现大量的乱码,只有少数的字符才会正常显示,这是因为在计算机底层编码中,只有特定范围的值是可以表现为字符的
人能看懂的代码----------------编译器、解释器--------------------机器能看懂的代码(由0、1组成)
动态链接库的文件通过libc进行链接,静态链接库的文件直接写在了文件的本身
有一种说法叫做C语言代码是转换一种格式写的汇编代码
计算机的鼻祖----图灵机,即打印纸带的机器,目前大家用的都是冯诺依曼机
可执行文件的分类:
1、windows:PE(Portable Executable)
可执行程序:.exe
动态链接库: .dll
静态链接库:.lib
2、linux:ELF(Executable and Linkable Format)
可执行程序:.out
动态链接库:.so
静态链接库:.a
一个ELF文件的主体部分是机器码,当然它并不仅仅只有机器码,它还有各种数据部分来标识这个文件的相关信息
3、ELF文件结构:
header -----------ELF header:表示ELF的文件头(ELF文件头表)
Program Header table:程序头(段表):进程映向不同部分权限的
sections -----------Code:给CPU认得机器码,代码段只读不可写
Data:就是计算机运行中用到的一些相关数据,数据段可写
Sections'names
header ------------Section Header table:节头表,是用来组织节的内容的,是用来组织ELF文件存储在磁盘上,各个节的 信息,节试图是给ELF用的,段视图是给进程的进程映向用的,就是记录各种节的分类信息
除了ELF header必须放在ELF的开头部分,其余的可随意放置
这三个表放置的都是控制信息,控制信息放置了一些可见字符与不可见字符
ELF文件在硬盘上和在内存中结构是相似的,但是是有区别的,磁盘是一个大容量低速存储器,内存是一个小容量高速存储器
最接近CPU的存储器是寄存器,下来就是cache(高速缓冲存储器),cache是一个高端CPU或者是低端CPU的直接体现,cache是CPU里自带的存储器
高端的CPU会配备多级cache
内存是用电频信号保存数据的,所以一断电,数据就会丢失
程序代码加载到内存中并不是仅仅只是程序的本体就够了,还会有各种各样的控制结构,程序stack(栈)用来管理函数的调用状态,heap用来给用户提供动态内存申请的调用,所以ELF文件是不足以支撑程序的运行的
objdump -s elf 用来查看elf文件在磁盘里的程序结构
cat /proc/pid/maps 在内存中的进程结构,但这个程序必须是正在执行没有停止的程序进程,如果想看可以去这个文件夹找系统维护的守护进程来看,还有一个方法是查看这个进程的内存空间信息gdb simple.elf