pwn 入门基础

2023-10-30

《web狗的pwn生之路》系列文章目录

第一章 pwn 入门基础

第二章 pwn 栈题基础

待更新…………



一、汇编基础

重点

各寄存器的作用

常用汇编指令的使用

各寄存器的作用

笔记

主流操作系统中,都是以字节(B)为寻址单位

计算机真正能运行的是二进制形式的机器码,一般以16进制呈现

汇编语言就是机器码的助记符

通用寄存器

RAX、RBX、RCX、RDX、RDI、RSI、R8、R9、R10、R11、R12、R13、R14、R15

RAX(RBX、RCX、RDX)向下兼容规则:

​	低 32 位:EAX

​	低 16 位:AX

​	低 16 位中的高 8 位:AH

​	低 8 位:AL

RDI(RSI、RSP)向下兼容规则:

​	低 32 位:EDI

​R8(R9、R10、R11、R12、R13、R14、R15)向下兼容规则:

​	低 32 位:R8d

​	低 16 位:R8W

​	低 8 位:R8B

栈顶指针:RSP

栈底指针:RBP

栈顶指针 与 栈底指针 用于维护程序运行时的函数栈

标志寄存器:EFLAGS

包括:AF、PF、SF、ZF、OF、CF 等标识位

指令寄存器:RIP

正常情况下,不能直接修改,每次运行一条指令自增一条指令长度

若要修改,可通过 call、jmp、ret 等跳转指令

汇编寻址(加中括号的是地址)

寻址方式 表示 含义
立即寻址 1234h 1234h数值本身
直接寻址 [1234h] 地址1234h
寄存器寻址 RAX RAX寄存器存的值
寄存器间接寻址 [RAX] RAX存的地址
变址寻址 [RAX + 1234h] RAX存的值 + 1234h 这个地址

汇编指令(分为 intel 和 AT&T)

指令 含义
mov rax rbx 将 rbx 的值赋给 rax
lea rax [rbx] 将 rbx 这个地址赋给 rax,同上
add rax rbx rax + rbx
sub rax rbx rax - rbx
and rax rbx rax & rbx
xor rax rbx rax ^ rbx
call 1234h 执行地址 1234h 处的函数
ret 函数返回
cmp rax rbx 比较 rax 与 rbx,保存至 EFLAGS 寄存器
jmp 1234h 使 rip = 1234h,无条件跳转到 1234h
push rax 将 rax 存储到栈顶
pop rax 将栈顶的值赋给 rax,rsp+8
xchg rax rbx 交换 rax、rbx 的值

call 与 jmp 的异同

call 与 jmp 都是跳转到一个地址

但是 call 会执行该地址处的函数,jmp 只跳转

二、Linux 基础

重点

大端序、小端序在计算机中的存储方式

理解栈的结构

笔记

虚拟内存是物理内存经过MUU(内存转换单元)转换后的地址(页表)

文件偏移地址 = 虚拟内存地址(VA)- 装载基址(Image Base)- 节偏移

节偏移 = 虚拟偏移 - 原始偏移

小端序

记忆口诀:高高低低

数据高位存储在计算机地址的高位

大端序

记忆口诀:高低低高

数据高位存储在计算机地址的低位

Linux 数据存储的格式是 小端序

​ 文件描述符:

Linux 中,一切都是文件

0:标准输入、1:标准输出、2:标准错误

栈是一种先进后出的数据结构,只有 push(压栈)和 pop(弹栈)两种操作

由于函数调用顺序也是 LIFO,所以我们能接触到的绝大多数系统都是通过栈来维护函数调用关系

在 Linux 中,系统为每个进程都安排了一个栈,进程中每一个调用的函数都有自己独立的栈帧
栈由高地址向低地址生长

三、调用约定

重点

了解函数调用相关的汇编指令

理解是函数调用过程中是如何维护栈平衡的

笔记

​ pop:

pop 指令的作用是弹栈,将栈顶的数据弹出到寄存器,然后栈顶的指针向下移动一个单位

pop rax	=========>	mov rax [rsp]; add rsp 8

​ push:

push 指令的作用是压栈,将栈顶指针向上移动一个单位,然后将一个寄存器的值存放在栈顶

push rax	=========>	sub rsp 8; mov [rsp] rax; 

​ jmp:

立即跳转,不涉及函数调用,用于循环,类似高级语言 if 产生的跳转

jmp 123h	=========>	mov rip 123h

​ call:

函数调用,需要保存返回地址

call 123h	=========>	push rip; mov rip 123h

​ ret:

用于函数返回

ret	=========>	pop rip

​ leave:

作用是维护栈帧,通常出现在函数的结尾。与 ret 连用

leve	=========>	mov rsp rbp; pop rbp

在调用函数的时候,rip 指针指向调用函数的下一条指令

被调用函数需要维护栈帧

push rbp
mov rbp rsp
sub rsp xxx		# 开启被调用函数的栈帧,xxx 为栈帧的大小

​ 栈帧的维护就是维护 rbp 和 rsp 两个指针

rsp 永远指向栈顶

rbp 用来定位局部变量

函数的返回值会存储到 rax 寄存器


​ 64 程序传参规则:

从左至右参数依次传递给 rdi、rsi、rdx、rcx、r8、r9

多于6个参数,后面的参数 从右至左依次压入栈中传递

​ syscall:

用于调用系统函数,调用时需要指明系统调用号

将系统调用号保存在 rax 寄存器中,然后布置好参数,即可执行 syscall 

如:调用 read(0, buf, size)

mov rax 0;
mov rdi 0;
mov rsi buf;
mov rdx size;
syscall;

函数的调用图:
请添加图片描述
函数调用返回图:请添加图片描述


四、ELF 文件结构

重点

了解 elf 文件的节信息

笔记

elf 是 Linux 中的二进制可执行文件

elf 的基本信息存在与 elf 的头部信息中,这些信息包括指令的允许架构、程序的入口等内容

通过 readelf -h <elf_name> 来查看头部信息

elf 包括许多节,各节存放不同数据,这些节的信息存放在节头表中,可以通过 readelf -s <elf_name> 查看
节名 存放的数据
.text 存放程序运行的代码
.rdata 存放一些如字符串等不可修改的数据
.data 存放一些已经初始化的可修改的数据
.bss 存放未被初始化的程序可修改的数据
.plt 与 .got 程序动态链接函数地址

elf 文件的节会被映射进内存中的段,映射机制是根据节的权限来进行映射的,可读可写的节被映射入一个段,只读的节被映射入一个段


五、延迟绑定

重点

了解什么是延迟绑定机制

了解 plt 与 got 的表的结构与作用 

笔记

一个程序运行过程中可能会调用很多函数,但是在一次运行中并不能保证全部被调用

静态编译

将所有可能运行到的库函数一同编译到可执行文件中

优点:不需要依赖动态链接库,适用于程序使用的动态链接库比较特殊

缺点:体积很大,编译速度很慢

动态编译

​遇到需要调用的库函数时再去动态链接库中寻找

优点:缩小了文件体积,加快了编译速度

缺点:会附带庞大的链接库;若计算机没安装对应库,则程序不能正常运行

​ PLT:

程序链接表,用于延迟绑定

​ GOT:

全局偏移表

ELF 中有两个 got 表,分别为 .got 和 .plt.got,前者用于全局变量的引用地址,后者用于保存函数的引用地址

不管是程序第几次调用外部函数,程真正调用的是 plt 表

第一次调用:

plt 表会跳到对应的 got 表

此时 got 表存的是 plt 表的一段指令的地址,其作用是准备一些参数进行动态解析

之后会跳到 plt 的表头,表头的内容是动态解析函数,将目标地址存入 got 表

之后的调用

plt 表跳到对应的 got 表

got 表存的是目标地址,直接跳转到该地址

在这里插入图片描述


六、Linux 保护机制

重点

了解各种保护机制的实现方式和产生的效果

学会各种保护机制的基本绕过方式

笔记

canary

用来判断程序的执行环境,主要针对栈溢出

开头为 \x00 的八字节随机数,随机数本体会存放于 fs 段偏移为 0x28 的区域

在函数调用中,程序都会将这段随机数存放于栈底,每次运行结束返回时,都会将这一随机数与本体进行对比

绕过方式:

  • 修改 canary

  • 泄露 canary

NX(Not Executable)

使程序中的堆、栈、bss段 等可写的段不可执行,导致不能执行我们自己编写的 shellcode

绕过方式:

  • 用 mprotect 函数来改写段的权限

  • 对于 rop 或 劫持got表 等利用方式不受影响

PIE 和 ASLR

PIE 指的是 程序内存加载基地址随机化,不能一下子确定程序的基地址

ASLR 是 使程序运行动态链接库、栈等地址随机化

绕过方式:

  • 泄露函数地址,通过偏移确定基地址

RELRO

主要针对延迟绑定机制,使 got 表这种和函数动态链接相关的内存地址,对用户只读,意味着不能劫持 got 表中的函数指针

​ gcc 编译时关闭程序保护:

PIE: gcc -no-pie

ASLR:

​ 查看:cat /proc/sys/kernel/randomize_va_space

​ 关闭: echo 0 > /proc/sys/kernel/randomize_va_space

RELRO: -z norelro

canary: -fno-stack-protector

NX: -z execstack


七、常用工具的使用

重点

了解 IDA 静态调试的基本技巧

了解 gdb 动态调试的基本技巧

掌握 pwnttools 的使用

笔记

IDA:

start 是程序真正的入口,它调用了 \_\_libc_start_main,而 \_\_libc_start_main 的第一个参数正是我们的 main 函数

如果 IDA 没有识别出 main 函数,可以先找到 start,start 一定可以识别出来

遇到不明白的函数,可以在 linux 中使用 man 命令查看函数的使用手册

快键键:

快键键 作用
h 转 10 进制与 16 进制
r 转字符
x 查看交叉引用
y 改变变量和函数返回值的类型
选择一段数据,按 shift + e dump 出一段字符串
TAB 转换汇编窗口和伪代码窗口
空格 转换两种汇编显示形式

gdb:

使用 gdb file_name 启动 gdb 或者 进入 gdb 后使用 file file_name 加载程序

命令 作用
b *地址 在该地址处下断点
info b 查看断点信息
info r 查看寄存器的值
vmmap 查看内存的布局
x/100gx 地址 以 16 进行格式查看 100 个四字数据(w 字、g 四字)
x/8i 地址 以指令的形式打印内存数据
x/s 地址 以字符串的形式查看地址存的数据
p &__malloc_hook 查看 __malloc_hook 的地址
p __malloc_hook 查看 __malloc_hook 的数据
p/x 0x100 - 20 计算 0x100-20 并以 16 进制打印
search ‘/bin/sh’ 查看内存的字符串
stack 20 查看栈上20个数据
bt 或 backtrace 函数调用栈
si 单步步入
ni 单步不过
c 从当前位置执行到断点处
r 从程序开始执行到断点处
finish 执行到当前函数的完

pwntools:

命令 描述
from pwn import * 导入 pwntools 的包
p = process(‘file’, env={‘LD_PRELOAD’: ‘libc’}) 加载本地程序,并指定程序使用的 libc
r = remote(‘ip’, port) 加载远程程序
p.recv() 接收程序传回的数据,可以添加整数参数,表示接收数据的大小
p.recvuntil(‘str’) 接收数据,直到接收完出现所给字符串为止,如果没有出现,程序会挂起
p.send(‘str’) 发送数据,末尾没有结束符
p.sendline(‘str’) 发送数据,末尾有结束符
p.sendafter(‘str1’, ‘str2’) recvuntil(‘str1’) 与 send(‘str2’) 的合体版
gdb.attach(p, ‘指令’) 启动 gdb 调试程序,并且启动前执行指令,多条指令可以使用 \n 分隔
p.interactive() 启动交互模式,可以使脚本执行完程序不退出
p64、32、16、8 将数据转为8、4、2、1字节的机器码
u64、32、16、8 将机器码进行解码

脚本模板:

from pwn import  *

context(log_level='debug', os='linux', binary='file', arch='i386', terminal=['tmux', 'sp', '-h'])	# arch 为文件的架构,分为 amd64 和 i386

p = process('file', env={'LD_PRELOAD': 'libc.so'})

p.recv()

p.sendline(payload)

p.interactive()

总结

最近开始比较系统的学习 pwn 知识,总结了一些基础知识的笔记,分享给师傅们,同时也希望师傅们来补充

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pwn 入门基础 的相关文章

  • ctf中pwn题目总结

    pwntools工具使用 1 安装 pip install pwntools xff08 python2 xff09 pip3 install pwntools xff08 python3 xff09 2 使用 Context设置 cont
  • pwnable.tw - orw

    简单概览 与 start 不同 该程序使用动态链接 提示仅允许有限的系统调用 open read write 函数 程序运行 哪怕是输入一个字母 程序仍然会出现段错误 检查安全措施 可见栈上开了 CANARY 程序 在 IDA 中反编译可见
  • 攻防世界PWN新手练习区——cgpwn2

    攻防世界PWN新手练习区 cgpwn2 首先检查文件的有哪些保护 checksec cgpwn2 32位程序 用IDA反编译文件 main函数中只有hello函数 点击查看 整个函数看起来是在进行某种算法 但关键点在于return gets
  • 攻防世界-pwn when_did_you_born(栈覆盖)

    0x01 拿到文件之后 先检查文件的基本信息 文件信息 64bit elf可执行文件 无PIE保护 0x02 执行文件 文件之中有两个输入 第一个输入有回显 0x03 IDA静态分析 可以看出获取flag需要用到v5的值 首先需要v5不等于
  • adworld-pwn-level2

    必要知识点 32位系统函数调用使用堆栈传参 其调用时栈的结构如下 返回地址 gt 参数n gt 参数n 1 gt gt 参数1 将elf文件扔到IDA中 跟进到vulnerable函数 里面有输入函数 可以用来做栈溢出 再看到有system
  • 2021第十四届全国大学生信息安全竞赛WP(CISCN)-- pwn部分

    CISCN 2021 WP 概述 ciscn 2021 lonelywolf ciscn 2021 pwny 第一种利用方式 第二种利用方式 ciscn 2021 silverwolf ciscn 2021 game 总结 概述 作为学习不
  • funcanary[CISCN2023初赛]-爆破canary+pie

    funcanary 一 保护检查 二 IDA分析 三 exp编写 四 exp 一 保护检查 先检查文件的保护以及文件的类型 保护全开 64位程序 通过题目大概也知道想考察的内容是canary保护绕过或者canary泄露 二 IDA分析 首当
  • xman 厦门邀请赛 pwn1 babystack writeup

    题目描述 这个题目针对现在的我还是有点难度的 花费了我三天的时间 最后发现原因竟是因为字符转化为整型的过程中多加了好多0 分析思路 1 首先查看文件的详细信息 tucker ubuntu xman pwn pwn1 file babysta
  • [OGeek2019]babyrop

    OGeek2019 babyrop 查看程序的保护机制 发现是got表不可写的32位程序 拖进ida查看伪代码 sub 80486BB是初始化缓存区的函数 发现buf是一个随机数 发现函数中存在strncmp比较函数 其中buf为用户输入的
  • 软件与系统安全复习

    软件与系统安全复习 课程复习内容 其中 软件与系统安全基础 威胁模型 对于影响系统安全的所有信息的结构化表示 本质上 是从安全的视角解读系统与其环境 用于理解攻击者 什么可信 什么不可信 攻击者的动机 资源 能力 攻击造成的影响 具体场景
  • 二进制安全虚拟机Protostar靶场(3)溢出控制程序指针,基础知识讲解 Stack Three,Stack Four

    前言 这是一个系列文章 之前已经介绍过一些二进制安全的基础知识 这里就不过多重复提及 不熟悉的同学可以去看看我之前写的文章 二进制安全虚拟机Protostar靶场 安装 基础知识讲解 破解STACK ZERO https blog csdn
  • ADworld_level_2

    以下是adworld里endust师傅的wp checksec扫描 使用ida打开可以发现 初始的buf的空间只有0x88 但是读取我们输入的内容的时候 选择的大小却是0x100 造成了溢出 通过这些 我们直接构建exp from pwn
  • 二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two

    前言 Protostar靶场的安装和一些二进制安全的基础介绍在前文已经介绍过了 这里是文章链接 https blog csdn net qq 45894840 article details 129490504 spm 1001 2014
  • 36D杯CTF——mengxinstack

    记录一下36D的mengxinstack题目 下载题目 checksec下分析 开启了很多保护 有canary 64位 IDA分析 知道这个程序先执行了一次read 再把read进去的东西print出来 再read 两次read都会造成栈溢
  • 第 46 届世界技能大赛浙江省选拔赛“网络安全“项目C模块任务书

    第46届世界技能大赛浙江省选拔赛 网络安全 项目C模块 夺旗行动 CTF 挑战 第46届世界技能大赛浙江省选拔赛 网络安全 项目C模块 第一部分 WEB 第二部分 CRYPTO 第三部分 REVERSE 第四部分 MISC 第五部分 PWN
  • 安卓pwn - De1taCTF(BroadcastTest)

    BroadcastTest 背景 逆向APK可知程序中仅有MainActivity Message和三个Receiver类 前者实现了一个Parcelable类 后三个则是广播 其中Receiver1是exported的 接收并向Recei
  • 再探ROP(下)

    文章目录 0x01 概述 0x02 ret2reg 2 1 起因 2 2 原理 0x03 brop详解 3 1 概述 3 2 逆向思维切入 1 搭建环境 2 溢出长度和爆破canary 3 如何getshell 4 寻找直接条件 5 寻找间
  • pwn 做题记录 2.8 adworld hello_pwn

    2022 2 8 今天其实没有起的很早 中午去玩3d打印机又花了很多时间 但是还是有一点点进展 首先解决了pwndbg的问题 其实别的blog本来说的就很清楚 找到gdbinit这个文件之后自己编辑就行了 但是之前操作的时候没有按照vim的
  • pwn入门:基本栈溢出之ret2libc详解(以32位+64位程序为例)

    目录 写在开头 题目简介 解题思路 前置知识 简要了解 plt表和got表 延迟绑定 例题详解 32位 64位 总结与思考 写在开头 这篇博客早就想写了 但由于近期事情较多 一直懒得动笔 近期被领导派去临时给合作单位当讲师 要给零基础的学员
  • 2.[BUU]rip

    1 检查文件 checksec 一下 查看之后发现是64位 直接放入IDA64进行反编译 2 IDA反编译 进行分析 发现是gets 函数可以造成栈溢出 从而可以覆盖栈上的内容 想法 通过gets函数 栈溢出 来篡改栈上的内容指令 从而达到

随机推荐

  • 【STM32CubeMX项目】小时钟V1.0

    前言 基于STM32CubeMx STM32F103C6T6编写时钟功能 现在以及能实现时钟的简单功能 做文记录下 还有很多可以改进的地方 也算留下的基础版本下来备份吧 我愿称之为V1 0版本 可供学习参考 实物 引脚接线 OLED STM
  • springboot启动流程

    springboot启动流程 四 application配置文件加载过程 lay 博客园 cnblogs com
  • 完全用 GNU/Linux 工作

    完全用 GNU Linux 工作 摈弃 Windows 低效率的工作方式 发掘 Linux 身上的 UNIX 气质 我已经半年没有使用 Windows 的方式工作了 Linux 高效的完成了我所 有的工作 GNU Linux 不是每个人都想
  • 【SQLi-LABS】Less -11 注入思路以及过程

    前言 less 11 是 sqli labs 的第一道 POST 型注入题 因此 我们不能再用之前 GET 型注入的方法 在搜索框进行注入 而是要在输入框里面完成注入 下面的注入流程是基于nliuc师傅的视频教程实现的 下面是他的博客 大家
  • C 语言中int, float, double 和 char 字节大小

    C 语言中int float double 和 char 字节大小 使用 sizeof 操作符计算int float double 和 char四种变量字节大小 sizeof 是 C 语言的一种单目操作符 并不是函数 sizeof 操作符以
  • 百炼智能发布垂直模型“爱迪生”,B2B行业的AIGC大潮来了

    图片来源 Pixels AIGC终于来到B2B行业 企业服务 AGI时代已拉开帷幕 数科星球原创 作者丨苑晶 编辑丨大兔 百炼智能是一家专注B2B行业的智能营销企业 在过去 该行业经历了大数据 人工智能时代的洗礼 随着行业对数据的运用不断纯
  • 内存带宽测试与AVX指令集读写内存

    一 内存理论带宽的计算 内存带宽计算公式 带宽 内存核心频率 内存总线位数 倍增系数 先容我从DDR的技术说起 DDR采用时钟脉冲上升 下降沿各传一次数据 1个时钟信号可以传输2倍于SDRAM的数据 所以又称为双倍速率SDRAM 它的倍增系
  • 知乎3000+赞,同事考上公务员后,抱怨“闲出了鸟”...

    番外篇 故事改编自知乎高赞回答 作者 陈大侠 链接 https www zhihu com question 266783359 answer 316889226 漫画原创公众号 不会笑青年 授权转载请联系微信 laughyouth369
  • Flutter应用开发,系统样式改不了?SystemChrome 状态栏、导航栏、屏幕方向……想改就改

    文章目录 开发场景 SystemChrome 介绍 SystemChrome的使用 导入 SystemChrome 包 隐藏状态栏 说明 改变状态栏的样式 注意事项 其他样式说明 锁定屏幕方向 锁定屏幕方向实例 注意事项 开发场景 开发AP
  • 爬虫学习笔记,从基础到部署。

    爬虫基础知识 笔记中出现的代码已经全部放到了github上https github com liangxs0 python spider save git 1 http基本原理 http 协议 在HTTP之上添加了安全协议的叫https s
  • js筛选对象中的空值

    如果对象中属性比较多 可以循环对象 let data id this equipmentID codeName this equipmentName equipmentInfo this equipmentSite pageSize thi
  • MySQL Index Condition小结

    什么是index Condition 索引下推 index condition pushdown 简称ICP 在Mysql5 6的版本上推出 用于优化查询 在不使用ICP的情况下 在使用非主键索引 又叫普通索引或者二级索引 进行查询时 存储
  • elementui的table复选框单选

  • 无线网卡插上电脑没反应的解决办法

    今天偶然切换WiFi时 网卡突然不能用了 右下角的网络连接标识一直都是显示的无网络 按照百度的方法试了 无非就是装驱动 插电脑后板 也没用 然后我就发现把无线网卡拔了重新插入的时候右下角显示了USB设备的标识 打开 我的电脑 也能发现有后面
  • 把一个表的查询结果当做另一个表的一个字段输出

    把一个表的查询结果当做另一个表的一个字段输出 CourseController java Controller GetMapping getPage number size ApiOperation value 分页查询课程表 含已更新章节
  • GlusterFS(GFS)分布式文件系统

    目录 一 文件系统简介 1 文件系统的组成 2 文件系统的作用 3 文件系统的挂载使用 二 GlusterFS概述 1 GlusterFS是什么 2 GlusterFS的特点 3 GlusterFS术语介绍 3 1 Brick 存储块 3
  • 【C#学习】设置TextBox组件的进度条并将接受到的数据展示在最下方

    设置TextBox组件的进度 将TextBox中的数据默认展示最下方 private void richTextBox2 TextChanged object sender EventArgs e 滚条设置在最下方 this richTex
  • sort自定义排序讲解

    问题 算法题当中对原始数据进行排序后 很大概率可以使得解题变得简单 一般情况下都是对 vector 等基本类型进行排序 这时直接使用 sort 函数即可 但是有时候我们想对自定义的结构体等类型进行排序 这时候直接调用sort就行不通了 需要
  • 《Python进阶系列》七:迭代器与生成器

    Python中的迭代器与生成器 quad quad 在Python中存在两种好用的功能 迭代器与生成器 以list容器为例 在使用该容器迭代一组数据时 必须事先将所有数据存储到容器中 才能开始迭代 而生成器却不同 它可以实现在迭代的同时生成
  • pwn 入门基础

    web狗的pwn生之路 系列文章目录 第一章 pwn 入门基础 第二章 pwn 栈题基础 待更新 文章目录 web狗的pwn生之路 系列文章目录 一 汇编基础 重点 笔记 二 Linux 基础 重点 笔记 三 调用约定 重点 笔记 四 EL