用patchelf改程序后在exp中用gdb.attach()调试堆栈
用patchelf改程序后在exp中用gdb.attach()调试堆栈问题来源在做pwn题时,经常遇到题目的libc版本与自己虚拟机的版本不同,而用patchelf改链接后,gdb堆栈指令看不了,困扰了我很久,查阅了很多师傅的博客找到了一种解决办法
实现方法:我这边拿2020纵横杯 wind_farm_panel这道pwn题做演示它的靶机是Ubuntu 16.04,libc2.23而我自己的虚拟机为kali 2022.3,libc2.36
首先patchelf改链接:ld可以在glibc-all-in-one中找到
12patchelf --replace-needed libc.so.6 你要换的libc的硬路径 ./pwnpatchelf --set-interpreter ld的硬路径 ./pwn
我这里改为
成功改完之后发现gdb堆栈的指令实现不了出现报错这里面的下载了也没用
12345678heap: This command only works with libc debug symbols. They canprobably be installed vi ...
爆破Canary
爆破CanaryCanary 爆破的原理Canary爆破是除Canary泄露外的另一个针对canary保护的利用方法。
对Canary而言,虽然每次进程重启后的Canary不同,但是同一个进程中的不同线程的Canary是相同的,并且通过fork函数创建的子进程的Canary也是相同的。我们可以利用这个特点,逐个字节将Canary爆破出来。不管是32位,还是64位的Canary,最低的一个字节均为0x00,从这个字节开始,依次破解每个字节:每次填入的值与Canary不匹配,则程序崩溃;每次填入的值与Canary匹配,则继续破解下一个字节。填入最高字节时,Canary匹配,就成功破解出了Canary。
爆破Canary的exp123456789101112131415161718192021222324252627from pwn import *context.log_level = 'debug'context.terminal = ['gnome-terminal','-x','bash','- ...
沙箱机制
沙箱机制0x00: 简介沙箱机制,英文sandbox也就是我们常说的沙箱,是计算机领域的虚拟技术,常用于安全方向。一般说来,我们不会将不受信任的软件放在沙箱中运行,一旦该软件有恶意行为,则禁止该程序的进一步运行,不会对真实系统造成任何危害。
在CTF比赛中,pwn题中的沙箱一般都会限制execve的系统调用,这样一来one_gaget和system调用都不好使,只能采取open/read/write的组合方式来读取flag。当然有些题目还会砍掉一个系统调用,进一步限制我们获取flag。
0x01: 开启沙箱的两种方式在CTF的pwn题中一般有两种函数调用的方式实现沙盒机制,第一种是采用prctl函数调用,第二种是使用seccomp函数。
在具体了解prctl函数之前,我们再了解这样一个概念,沙箱是程序运行过程中的一种隔离机制,其目的是限制不可信进程和不可信代码的访问权限。seccomp是内核中的一种安全机制,seccomp可以在程序中禁用掉一些系统调用来达到保护系统安全的目的,seccomp规则的设置,可以使用prctl函数和seccomp函数。
0x0: prct ...
栈迁移技术-PWN
栈迁移技术-PWN
本文将对CTF Pwn中「栈迁移」(又称「栈转移」)这一技术进行介绍与分析,希望读完本文后以下问题将不再困扰你:
什么是栈迁移?
栈迁移解决了什么问题?
怎么使用栈迁移这个技巧?
开始之前,有如下预备知识会极大提升你的阅读体验:
CTF Pwn是在做什么?提权(Getshell)是什么意思?
在操作系统内存布局中,栈是一种怎样的结构,具有怎样的特点?
x86中常用寄存器的名称与作用?函数调用栈的原理与过程是怎样的?
栈溢出攻击的核心技巧是什么?
栈溢出是怎么回事?在预备知识的4个问题中,也许第四个会困扰到你。其实,如果知道了前三个问题的答案,联想编程时偶尔出现的「 Error:Index out of bound」报错,栈溢出(stackoverflow)是怎么一回事也非常简单了。下图是一个函数栈布局的常见状态。
顾名思义,栈溢出就是当外界输入过长时,将会超过局部变量(常为数组)的「势力范围」,从而造成数据溢出;如下图所示。
因此,栈溢出能使我们覆盖栈上某些区域的值,甚至是当前函数的返回地址 ret ;一旦 ret 覆盖为某个奇怪的值,例如 ...
栈溢出计算偏移量
栈溢出计算偏移量一,GDB调试出偏移量1230x8048677 <main+95> lea eax, [esp + 0x1c] 0x804867b <main+99> mov dword ptr [esp], eax► 0x804867e <main+102> call gets@plt
通过这一串汇编指令可以看出来,此时起始地址相对于esp的偏移为0x1c,只要查看这时候的esp和ebp的寄存器就可以知道偏移量为多少。
12EBP 0xffffcfb8 ◂— 0x0ESP 0xffffcf30 —▸ 0xffffcf4c ◂— 0x0
这里就可以算出来起始地址相对于返回地址的偏移为0xffffcfb8 - 0xffffcf30 - 0x1c + 4。为112。这里的加四为ebp的值,在返回地址前还有一个ebp的值也要覆盖。
二,GDB-peda计算偏移量
使用gdb运行程序
gdb ./pwn
生成溢出字符串
($gdb-peda) pattern create 200
长度需要保证可以 ...
安全计算模式 seccomp_rule_add(3)使用文档
安全计算模式 seccomp_rule_add使用文档名称seccomp_rule_add, seccomp_rule_add_exact - Add a seccomp filter rule
简介123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include <seccomp.h>typedef void * scmp_filter_ctx;int SCMP_SYS(syscall_name);struct scmp_arg_cmp SCMP_CMP(unsigned int arg, enum scmp_compare op, ...);struct scmp_arg_cmp SCMP_A0(enum scmp_compare op, ...);struct scmp_arg_cmp SCMP_A1(enum scmp_compare op, ...);struct scmp_arg_c ...
利用$0getshell
利用$0getshell前言做一道限制了/bin/sh的题的时候,想了好多办法去绕过限制和平衡栈,但是没想到一个奇怪的利用姿势,利用shell的$0去getshell
$0在shell中
$0 就是编写的shell脚本本身的名字
$1 是在运行shell脚本传的第一个参数
$2 是在运行shell脚本传的第二个参数
$$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
$! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
$? 最后运行的命令的结束代码(返回值)
这里$0就是我们需要用到的了,在pwn题的远程环境中,这个0就是shell
利用所以我们在执行system函数的时候可以执行system(“$0”)去代替system(“/bin/sh”)
效果是一样的,类似于下面这样
12345system=0x0400712main=0x4008A0pop_rdi_ret=0x0000000000400983sla("Dear Mercedes owner, what ...
关于CTF-PWN获得shell后没有读取flag权限的问题
关于CTF-PWN获得shell后没有读取flag权限的问题前言在和学弟的一次日常交流中,发现linux权限设置有个很神奇的设置,可以用来出点有意思的题。主要思路是https://pwn.college/desktop里面的有趣设置
RWS一、rws权限的概念和特点rws是Linux文件权限中的一种,它是与set-UID和set-GID(SUID和SGID)特性相关联的权限。SUID和SGID是授予执行权限和组权限的一种特殊权限。SUID使得一个文件在被执行时拥有文件所有者的权限,而SGID则使得一个文件在被执行时拥有文件所在组的权限。SUID和SGID通常与可执行文件相关联,使得某些程序在执行时可以获得超级权限,比如管理员权限。
rws权限是rwx权限中的一种特殊形式,即在执行权限(x)的位置上,将其替换为s。rws权限的全称是set-UID、set-GID和可执行(即rwx权限)。使用rws权限赋予文件的执行者以文件所有者和文件所在组的权限,这使得这个文件可以在执行期间以这些权限运行程序。rws权限还是一种持久性的权限,即一旦授予某个文件,持续有效,不会因为文件移动或者复制而失效。 ...
侧信道爆破二分法
侧信道爆破二分法前言在经过一段时间的休息后,总算有时间开始搞ctf了,把以前没有完成的任务完成一下,并记录。
vim优化方案
侧信道二分法爆破
Vim优化方案在复现网上的相对应的题目时,由于没有原本的文件,按照对应思路写了一个文件,顺便优化了一下vim
用的是vim-plug加各种小插件的方案
gruvbox
nerdtree
vim-airline
首先安装vim-plug
https://github.com/junegunn/vim-plug这是地址
12curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
发现需要科学上网,但是我的虚拟机不知道为什么无法科学上网,可能是配置的问题,有其他解决办法我就没有深究。
于是使用第二种办法
123git clone https://gitee.com/S_rui/vim-plug.gitcp ./vim-plug/plug. ...
二进制文件应急修复
二进制文件应急修复漏洞修复概述在具体分析一个漏洞之前,我先将漏洞简单的分一下类,根据漏洞修复的难度,可以把漏洞分为以下四类
后门函数、危险的字符串(/bin/sh)、输入函数长度溢出(硬编码)等
格式化字符串等
指针悬挂、堆栈溢出(动态长度)等
逻辑漏洞
这几类漏洞在 CTF、AWD 比赛中很常见,也是二进制漏洞利用的主要考察点,按照不同的漏洞又可以总结出几种修复方式
暴力 nop、修改硬编码数据
替换 GOT 表条目、符号解析信息
第三方工具替换系统函数、添加代码
手动添加代码
实际上,无论是何种修复手段,无非是对程序的代码进行添加、删除或者修改,虽然没有源代码,但是开发者们制作出了很多实用工具,灵活实用这些工具,就算没有源代码也可以实现对 binary 的 patch。
Patch 的核心思想:在不破坏程序原有功能的情况下,加入或者删除部分代码,修复程序的漏洞。
删除代码容易实现,但是插入代码难度就比较高了,具体我们在下面讨论。
工具简介在 patch 二进制文件时几个常用工具:
IDA
keypatch
LIEF
IDA 无需多言,keypatch ...