ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pwn第一天

2021-07-26 13:01:35  阅读:241  来源: 互联网

标签:函数 第一天 地址 内存 install pwn shellcode


PWN新手自用入门笔记


寄存器的知识:
保存栈状态的寄存器是存在在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

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

标签:函数,第一天,地址,内存,install,pwn,shellcode
来源: https://blog.csdn.net/u011407763/article/details/119009256

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有