PWN入门

卦者那啥子二福 / 2023-06-26 / 原文

备忘

题目一般包含的两部分

  • 含有漏洞的二进制程序
  • 远程运行二进制程序的ip和端口
  • 利用程序漏洞读取flag
  • 任意代码执行
  • 本地提权

一般流程

Binary \(\to\) 逆向找洞 \(\to\) 写漏洞利用程序 \(\to\) 本地调试 \(\to\) 打远程 \(\to\) 读flag

常用工具

  1. $IDA \ Pro $ 逆向二进制工具
  2. \(python + pwntools\) 编写漏洞利用脚本
  3. \(gdb\) + 插件 调试
  4. \(file,strings,readelf\)等查看\(ELF\)文件工具
  5. \(checkec,ROPgadget\)等漏洞相关的小工具

GDB

插件

pwndbg + Pwngdb

常用指令

  • break 下断点
  • p打印值,x打印内存
  • stack查看栈
  • tele,dq查看内存

pwntools

漏洞利用库

pip install pwntools

常用接口

  • process,remote 交互
  • send,sendline,sendafter,recv,recvuntil 交互
  • p64,u64,p32,u32 把数字转适合程序的字符串
  • context 设置环境
  • ELF

缓冲区溢出(buffer overflow)

程序员没有对buffer做长度检查,使攻击者可以输入超过buffer长度的内容,修改其他地址的内存,严重时甚至可以劫持控制流

按位置可以分为\(stack \ base\) ,$data \ base $, $heap \ base $

可能导致缓冲区溢出的函数

  • gets,scanf,strcpy,strcat,memcpy

调用约定

function call

  • call push return address to stack and jump

function return

  • ret:pop rip
  • 将返回地址从栈顶弹出,放入rip中 mov rip ,[rsp];add rsp,8

参数传递

  • 使用寄存器传参,不够了放栈上
    • 依序放到rdi,rsi,rdx,rcx,r8,r9
  • 放入寄存器后function call

栈溢出 stack overflow

作用:可以跳转程序任意位置

shellcode

  • 一段可以用来弹shell的代码
  • 注入已知地址且可执行的内存处
  • 利用栈溢出劫持控制流到shellcode位置

Protection

利用checksce查看二进制开启了那些保护

DEP/NX

  • 可写的不可执行,可执行的不可写
  • 直接只用ret2shellcode攻击似乎不行
  • Bypass:ROP

ROP

面向返回地址编程

利用ret去执行程序中包含ret的程序片段