二进制基础

最近开始入坑系统安全大坑,调转方向开始了解pwn,那就要补一些那少得可怜的底层基础啦

  • 先学几个单词:
    • exploit:用于攻击的脚本与方案
    • payload:攻击载荷,是目标进程被劫持控制流的数据(精心构造的恶意数据,目标进程执行后就会触发这个漏洞)
    • shellcode:调用攻击目标的shell的代码
  • 还有一些工具
    二进制基础_第1张图片

linux下的C语言编译

C语言在pwn里面有着举足轻重的地位,C往往是计算机科班学习的第一门语言(自学的就看自己啦哈哈),C上可写高级语言,下可操作硬件,同时在pwn中有40%的漏洞是由C/C++编写的,是非常重要的一部分。

命令观察

在kali的命令行中,如图进行测试实验
二进制基础_第2张图片
通过vim创建并编写C语言文件,gcc进行编译,之后可以看到生成了a.out文件,这就是linux里面的可执行文件了。后面要执行的时候注意要用"./a.out",直接写“a.out”的话会被当成命令而显示未找到命令

可以加上‘-o’参数指定输出文件名:
二进制基础_第3张图片
拿到pwn先运行,看看他是干啥的,再去反编译等内容

打印一下二进制程序:
二进制基础_第4张图片
这实际就是可执行文件了
再查看一下他的格式
在这里插入图片描述

显示是ELF,64位,小端序(LSB)的,是linux下的可执行文件的格式。

linux提供了读ELF文件的命令:readelf
可以用:readelf -a filename | less
二进制基础_第5张图片
里面也会记录所用到的一些函数
二进制基础_第6张图片

  • nm可以查看运行的一些过程,可以看有哪些符号表,用到了哪些函数
    二进制基础_第7张图片
  • hexdump可以查看其十六进制
    hexdump question_1_x64 | less
    二进制基础_第8张图片
  • ldd:查看里面用到的库函数的位置
    在这里插入图片描述
    file可以看到用了哪个链接器,但是ldd可以把用到的东西全部显示出来
    如:下面路径下就会有一个libc.so.6
    二进制基础_第9张图片
  • objdump:可以将程序反编译成汇编指令
    命令:objdump -d filename | less
    二进制基础_第10张图片
    这是APT模式下的汇编指令,要是想看Intel的汇编指令,可以加参数-M intel:objdump -d -M intel filename | less
    二进制基础_第11张图片

编译过程

gcc命令可以对C语言文件进行编译,但实际上这条命令为我们隐藏了很多中间过程,具体过程如下图所示
二进制基础_第12张图片

  1. 首先要进行一个预处理,不过这对pwn来说不用太关心,这之后就会得到预处理过后的C语言代码
  2. 编译:C语言代码经过汇编转化为汇编代码(此时起作用的是一个汇编器),此时还是给程序员看的汇编代码,而不是给机器看的机器代码(机器只能读懂机器码)
  3. 汇编:由汇编代码生成机器码,之后生成的就是ELF文件了(此时这个文件就已经是个目标文件而且保存的是机器码,但是此时还并不是一个可执行文件,还需要进行链接,因为当前她只包含了C语言代码中自己写的那部分文本,其调用的功能是由系统中的链接库实现的,需要链接)
  4. 链接:将编译后的文件链接成可执行文件

二进制基础_第13张图片

可执行文件

概念

  • 狭义: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

你可能感兴趣的:(pwn,pwn,安全)