pwn第一天

2024-06-07 11:38
文章标签 第一天 pwn

本文主要是介绍pwn第一天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PWN新手自用入门笔记

  • 1.pwn需要准备的工具
    • pwntools
    • checksec
    • Ropgadget
    • GDB
    • one_gadget
    • LibcSearcher
  • 2.pwn题小试牛刀
    • 首先是用nc连接服务端
    • 做题步骤和思路
      • 1.ret2text
      • 2.ret2shellcode

寄存器的知识:
保存栈状态的寄存器是存在在cpu里的,是整台计算机中最高速的存储容量最小的,cpu两个寄存器 sp bp 对应的32 为 esp ebp
64位为rsp rbp

ebp总是指向当前栈帧的栈底 存放的内容总是上一个函数的栈底,我们要是销毁一个函数,他需要回到上一个函数的状态

esp总是指向当前栈帧的栈顶

1.pwn需要准备的工具

  1. IDA PRO
  2. pwntools
  3. pwndbg
  4. checksec
  5. ROPgadget
  6. one_gadget
  7. LibcSearcher
  8. main_arena_offset

pwntools

其实就是python3中的一个库,许多关于pwn的攻击都是基于这个库的利用, from pwn import * 是pwn手的第一行代码
pwn其实是黑客的俚语,象声词,也是二进制漏洞的安全,和web有什么不同呢,web是高级语言中的一些纰漏,比如php语言中的特性中的漏洞,但pwn不同,pwn是转化为汇编语言和机器码去寻找当中的漏洞,所以要求有扎实的基础,c语言尤为重要。

sudo pip3 install pwntools -i https://pypi,tuna.tsinghua.edu.cn/simple

checksec

拿到题第一步拿checksec检查下保护机制

Ropgadget

安装pwntools会自动安装上 搜索rop链的

GDB

pwndbg地址:http://github.com/pwndbg/pwndbg在这里插入图片描述

动态调试,原生的不足以做题,需要安装pwndbg工具

sudo apt install gdb

one_gadget

已经劫持程序控制流 到libc中的一个地址了,需要返回libc中的rop链,获取shell,我们不用手动构造,利用one_gadget工具找到地址,从给出的地址能获取一个shell
在这里插入图片描述
先安装ruby

sudo apt install ruby
sudo apt install gem
gem install one_gadget

LibcSearcher

清华大佬写的工具,有点落后了库

https://github.com/IZAY01/LibcSearcher

依扎药依师傅修好后 更新的LibcSearcher

2.pwn题小试牛刀

首先是用nc连接服务端

正常程序都是部署在服务器中,我们需要用 nc ip 端口 进行连接访问这个程序
当然我们可以通过idapro逆向分析之后,在本地通过pwntools进行本地内存调试

python3
from pwn import *
io = process(“./本地文件”)-----本地调试进程的
io=remote("ip", 端口) --------远程连接的
io.recv() -----接收全部
io.recvline()----接收一行
linux中自带的base64解密工具步骤
echo ZmxhZ3tuMHRfZjRzdGVyX3Q2YW5feTB1fQo= | base64 -d

做题步骤和思路

1.ret2text

首先先checksec一下
在这里插入图片描述
因为是简单题,我们查看之后没有发现保护,直接idapro进行逆向分析,通过伪c代码找到了缓冲区溢出漏洞的来源 char buf【8】
以及get()输入的函数,然后就需要找esp所在的位置进行覆盖返回地址,但是esp寄存器返回的位置idapro静态分析给出的不一定正确,就需要利用gdb工具进行动态调试

首先步骤:
在这里插入图片描述

gdb ret2text

然后就会进入到pwngdb中 然后设置断点,方法就是 b main
break point 的缩写 b 后面加上函数名 或者需要暂停的内存地址,

然后进行run 输入r就跑起来了,然后会获得
STACK栈的结构
REGISTERS 寄存器的信息
DISASM 反汇编的信息

然后输入n 也就是next 进行下一项,按 s set in 进入到函数内部,然后再输入n进行运行,就会等待输入
在这里插入图片描述

然后输入stack 24 看长度24项栈的值。
esp就是栈顶
eax 我们输入的目标就在中间然后我们通过缓冲区溢出漏洞进行覆盖
ebp就是栈底 指向的前一个函数的被保存在栈底的ebp的值
再高一个地方 就是返回地址 我们目标攻击的就是返回地址
在这里插入图片描述

2.ret2shellcode

影响到栈的保护措施

  1. the nx bits -----保护栈以及写入数据的地方
  2. aslr
  3. canary

其他的保护措施

  1. pie -------bss随机化地址
  2. relro--------

checksec nx保护是默认打开的

the nx bits (the no-execute bits)
程序与操作系统的防护措施,编译时决定是否生效,由操作系统实现
通过在内存页的标识中增加”执行”位可以表示该内存页是否可以执行,若程序代码的EIP执行至不可运行的内存页,则CPU将直接拒绝执行指令"造成程序崩溃

ASLR (Address Space Layout Randomization)
在这里插入图片描述
bss是存放局部变量的
在这里插入图片描述
date text是创建二进制文件时候就存在的,heap以及stack都是写入内存时候创建的

pwntools 里面的shellcraft 可以自动生成shellcode,但自动生成的都是32位的
print(asm(shellcraft.sh()))
加上amd.64变成架构64位的shellcode
print(asm(shellcraft.amd64.sh()))

context.arch=“amd64”
加上这一行再设置shellcode 否则会打空的

ROP的全称为Return-oriented
programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。通过上一篇文章栈溢出漏洞原理详解与利用,我们可以发现栈溢出的控制点是ret处,那么ROP的核心思想就是利用以ret结尾的指令序列把栈中的应该返回EIP的地址更改成我们需要的值,从而控制程序的执行流程。

0x03 为什么要ROP

探究原因之前,我们先看一下什么是NX(DEP)
NX即No-execute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。随着
NX 保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果。所以就有了各种绕过办法,rop就是一种

vmmap
虚拟内存的分布,分析读写权限,读写通常要分开
在这里插入图片描述
未初始化的全局变量,是存在bss中

p32()是为了将整数的地址打包成一个字节型的数组的一个函数

payload = asm(shellcraft.sh()).ljust(112,b’a’) + p32(buf_addr)

shellcraft.sh() 是构造payload的shellcode 是汇编码

asm之后变成机器码 但是是多少位置,一个一个数太麻烦了,有python内置的函数 just进行补全垃圾数据,然后加上buf 在bss处的地址然后进行覆盖,执行shellcode

笔记未完暂定,本文提供给自己复习回忆,也希望给同样入门的新手一个帮助,因为编程能力有限,感觉出现了知识断层,先去把汇编和编程能力补上来继续再研究二进制的安全问题,确实狠吸引人!!!!

这篇关于pwn第一天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039074

相关文章

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

《C++标准库》读书笔记/第一天(C++新特性(1))

C++11新特性(1) 以auto完成类型自动推导 auto i=42; //以auto声明的变量,其类型会根据其初值被自动推倒出来,因此一定需要一个初始化操作; static auto a=0.19;//可以用额外限定符修饰 vector<string> v;  auto pos=v.begin();//如果类型很长或类型表达式复杂 auto很有用; auto l=[] (int

Android--第一天

创建AVD: 启动AVD: 点击按钮:Launch如下: 更换来电铃声: Window-->Show View-->Other... 点击进入:展开Android文件夹-->选择File Explorer:操作如下图 要想在音乐播放器上有该音乐,必须先“卸载SD卡,在安装SD卡”这样就可以了,声音--

Oracle第一天之sql

SQL 支持下列类别的命令:  数据定义语言(DDL)  数据操纵语言(DML)  事务控制语言(TCL)  数据控制语言(DCL) 数据类型 字符数据类型    :long   char  varchar2 CHAR: 当需要固定长度的字符串时,使用 CHAR 数据类型。          CHAR 数据类型存储字母

Oracle第一天之Oracle介绍

Oracle数据库由操作系统文件组成,这些文件提供数据库信息提供实际物理存储区 物理组件  : 数据文件+控制文件+日志文件 逻辑组件  :         数据库 | 表空间     至少一个:  名为 SYSTEM的系统表空间,由数据文件组成,一一对应;表空间的大小=所有构成该表空间的

BUUCTF PWN wp--bjdctf_2020_babystack

第一步   checksec一下,该题是64位的,该题目大概率是一道栈溢出(因为题目里面提到了stack) 分析一下这个二进制保护机制: Arch: amd64-64-little 这表示二进制文件是为64位AMD处理器设计的,使用的是小端序(little-endian)格式。RELRO: Partial RELRO RELRO(Relocation Read-Only)是一种安全特性,旨

mysql 获取本月/上月/下月第一天/最后一天

select curdate(); -- 获取当前日期select last_day(curdate()); -- 获取当月最后一天。select DATE_ADD(curdate(),interval -day(curdate())+1 day); -- 获取本月第一天select date_add

2024年“羊城杯”粤港澳大湾区网络安全大赛PWN 全部解析

2024年“羊城杯”粤港澳大湾区网络安全大赛PWN 全部解析 hard+sandbox:ptrace 系统调用概述: logger:pstack: [X] 🛰:ly3260344435[X] 🐧:3260344435[X] BiliBili:鱼影信息[X] 公众号:鱼影安全[X] CSDN:落寞的魚丶[X] 知识星球:中职-高职-CTF竞赛[X] 信息安全评估(

寒假集训第一天——结构体

期待已久的寒假集训终于开始了,第一天讲的内容比较简单——结构体,之前就学了点。。。 表示普通的结构体会用,涉及到指针都不大会,今天算是学了点指针的用法。。。 作业描述如下: 结构体 今天作业  1.定义一个acmer结构体,包括以下信息:姓名,学号,手机号,做题数,出生日期,其中出生日期date也是一个结构体,包括年、月、日  2.建立结构体数组,实现对多个同学

java 获取周、月、年的第一天以及最后一天的详细代码

public class MyCalendar { public static Date getDate(Calendar c) {      return new Date(c.getTimeInMillis());   }   /** * 得到本周第一天 * @return */ public static Calendar getFir