当前位置: 首页 > news >正文

CTF-PWN-tips

文章目录

  • overflow
    • scanf
    • get
    • read
    • strcpy
    • strcat
  • Find string in gdb
    • gdb
    • gdb peda
  • Binary Service
  • Find specific function offset in libc
    • 手工
    • 自动
  • Find '/bin/sh' or 'sh' in library
    • 手动
    • 自动
  • Leak stack address
  • Fork problem in gdb
  • Secret of a mysterious section - .tls
  • Predictable RNG(Random Number Generator)
  • Make stack executable
  • Use one-gadget-RCE instead of system
  • Hijack hook function
  • Use printf to trigger malloc and free
  • Use execveat to open a shell

overflow

假设:定义了char buf[40] signed int num

scanf

  • scanf(“%s”, buf)
    %s没有边界检查,可以溢出
  • scanf(“%39s”, buf)
    %39仅从输入中获取39个字节,并将NULL字节放在输入末尾,无法溢出
  • scanf(“%40s”, buf)
    从输入中获取40个字节,但还会在输入末尾的位置放NULL字节,存在单字节NULL溢出
  • scanf(“%d”, &num)
    结合alloca(num)使用,如果设置num为负值,会出现从栈上分配的堆与原来的栈帧重合
    大多数时候,程序只检查了上界而没有忘记num可能为负数(或者说忘了设置num为无符号数),此时将num输入为负数可能有意外的效

alloca()是在栈(stack)上申请空间的

get

  • gets(buf)
    没有边界检查,可溢出
  • fgets(buf,40,stdin)
    从输入中获取39个字节,把NULL字节放在输入末尾,无用

read

  • read(stdin, buf, 40) fread(buf, 1, 40, stdin)
    从输入中获取40个字节,并且不会在末尾放置NULL字节,可能存在信息泄露
    例如
    0x7fffffffdd00: 0x4141414141414141 0x4141414141414141 0x7fffffffdd10: 0x4141414141414141 0x4141414141414141 0x7fffffffdd20: 0x4141414141414141 0x00007fffffffe1cd
    此时如果用printf或puts用于输出buf,它将一直输出,直到NULL字节
    此时可以得到’A’*40 + ‘\xcd\xe1\xff\xff\xff\x7f’,从而信息泄露成功

strcpy

假设:定义char buf2[60]

  • strcpy(buf,buf2)
    strcpy()函数将源字符串buf2 的每个字节拷贝到目的字符串buf 中,直到到达NULL字节,buf2字符串末尾的NULL字节也被拷贝过去,buf2可能比buf长,所以可能溢出
  • stncpy(buf,buf2,40) memcpy(buf,buf2,40)
    将40个字节从buf2复制到buf,但不会在末尾放置NULL字节,由于没有NULL字节,可能存在信息泄露,如printf或puts该内容时,同上面的read的信息泄露

strcat

  • strcat(buf,buf2)
    把 buf2 所指向的字符串追加到 buf 所指向的字符串的结尾。如果buf不够大,可能会导致溢出
    会把NULL字节放在末尾,可能会导致一字节溢出
    在某些情况下,可以使用该NULL字节正好覆盖储存堆栈地址的最低位字节
  • strncat(buf, buf2, n)
    strncat() 在strcat() 的基础上增加第三个参数,其中第三个参数限制添加的最大字符数,其他跟strcat() 一样:把拼接后的字符串作为新的第一个字符串同时也会把NULL字节放在末尾,第二个字符串的值不改变;返回值是第一个参数的地址
    也可能会有单字节NULL溢出

Find string in gdb

environ利用
通过libc找到environ地址后,泄露environ地址处的值,可以得到环境变量地址,环境变量保存在栈中,通过偏移可以得到栈上任意变量的地址。
ssp((Stack Smashing Protect) )攻击
检测到stack smash时,__stack_chk_fail函数会在报错信息中会打印出libc_argv[0]的值,而libc_argv[0]指向的则是程序名。
若我们能够栈溢出足够的长度,覆盖到__libc_argv[0]的位置,那我们就能让程序打印出任意地址的数据,造成任意地址数据泄露。这就是ssp攻击。

在SSP攻击中,我们需要找到argv[0]和输出开始地址之间的距离

gdb

gdb print打印

  • 在gdb中使用p/x ((char **)environ),argv[0]的地址将是打印的地址值 - 0x10
(gdb) p/x (char **)environ # 以十六级进制形式打印
$9 = 0x7fffffffde38
(gdb) x/gx 0x7fffffffde38-0x10 #以一个八个字节为单元十六进制形式显示一个单元地址的内容
0x7fffffffde28: 0x00007fffffffe1cd
(gdb) x/s 0x00007fffffffe1cd#显示地址对应的字符串
0x7fffffffe1cd: "/home/naetw/CTF/seccon2016/check/checker"

gdb peda

使用 searchmem "/home“可找到argv[0]的位置,如图在

[stack] : 0x7fffffffe2cc (“/home/llk/桌面/exp/dui/b00ks”)
在这里插入图片描述

Binary Service

ncat 将二进制文件转换为IP地址和端口

加载顺序为LD_PRELOAD > LD_LIBRARY_PATH > /etc/ld.so.cache > /lib>/usr/lib
LD_PRELOAD(not LD_PRELOAD_PATH) 是要在任何其他库之前加载的特定库 ( files ) 的列表,无论程序是否需要。LD_LIBRARY_PATH是在加载无论如何都会加载的库时要搜索的 目录列表。

  • ncat -vc ./二进制文件名 -kl 127.0.0.1 端口号

当需要修改动态链接库的时候

  • ncat -vc ‘LD_PRELOAD=/path/to/libc.so ./binary’ ./二进制文件名 -kl 127.0.0.1 端口号
  • ncat -vc ‘LD_LIBRARY_PATH=/path/of/libc.so ./binary’ ./二进制文件名 -kl 127.0.0.1 端口号

然后可以通过nc 127.0.0.1 端口号来允许该程序
在这里插入图片描述

Find specific function offset in libc

当我们成功泄露函数地址时,可以得到libc的基地址通过得到函数地址减去函数的偏移

readelf是用来读取elf文件相关信息的

手工

  • readelf -s libc文件 | grep 函数名
    在这里插入图片描述

自动

  • 使用pwntools提供的函数
from pwn import *libc = ELF('libc文件')
system_off = libc.symbols['函数']

Find ‘/bin/sh’ or ‘sh’ in library

objdump反汇编文件

手动

  • strings -tx libc文件 | grep 字符串

自动

from pwn import *libc = ELF('libc.so')
...
sh = base + next(libc.search('sh\x00'))
binsh = base + next(libc.search('/bin/sh\x00'))

Leak stack address

Fork problem in gdb

Secret of a mysterious section - .tls

Predictable RNG(Random Number Generator)

Make stack executable

Use one-gadget-RCE instead of system

Hijack hook function

Use printf to trigger malloc and free

Use execveat to open a shell

参考Naetw大佬的GitHub上的总结

相关文章:

CTF-PWN-tips

文章目录 overflowscanfgetreadstrcpystrcat Find string in gdbgdbgdb peda Binary ServiceFind specific function offset in libc手工自动 Find /bin/sh or sh in library手动自动 Leak stack addressFork problem in gdbSecret of a mysterious section - .tlsPredictable …...

《Effective C++》条款21

必须返回对象时,别妄想返回其reference 如果你的运算符重载函数写成了返回reference的形式: class A { public:A(int a,int b):x(a),y(b){}friend const A& operator*(const A& a, const A& b); private:int x;int y; }; const A& opera…...

决策树,sql考题,30个经典sql题目

大数据: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学&#x…...

【ES6.0】- 扩展运算符(...)

【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

关于Java中的深拷贝与浅拷贝

Java中的深拷贝和浅拷贝是针对对象和数组等引用数据类型的复制操作。 浅拷贝(Shallow Copy): 对于基本数据类型,浅拷贝直接复制其值。对于引用数据类型,浅拷贝只复制对原对象的引用,而不是复制对象本身。因…...

13.真刀实枪做项目---博客系统(页面设计)

文章目录 1.预期效果1.1博客列表页效果1.2博客详情页效果1.3博客登陆页效果1.4博客编辑页效果 2.实现博客列表页2.1实现导航栏2.2实现版心2.3实现个人信息2.4实现博客列表2.5博客列表页完整代码 3.实现博客正文页3.1引入导航栏3.2引入版心3.3引入个人信息3.4实现博客正文3.5博客…...

VScode 配置用户片段

文件->首选项->配置用户片段->新建全局用户片段 后续就可以通过vv3来直接生成下面的代码 {// Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // description. Add comma separated ids of the l…...

Fedora 项目近日发布了 Fedora Linux 39

导读几经推迟之后,Fedora 项目近日发布了 Fedora Linux 39,这是红帽公司赞助的面向大众的 GNU/Linux 发行版的最新稳定版本,采用了最新的技术和开源应用程序。 Fedora Linux 39 由 Linux 内核 6.5 支持,并提供了一些最新的桌面环境…...

Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)

目录 前言: 一、什么是iBeacon技术 二、Uniapp连接iBeacon设备的准备工作 硬件设备: 三、Uniapp连接iBeacon设备的实现步骤 创建Uniapp项目: 四、Uniapp连接iBeacon设备的应用场景 室内导航: 五、Uniapp连接iBeacon设备的未来…...

GCD:异步同步?串行并发?一文轻松拿捏!

GCD 文章目录 GCD进程线程进程与线程的关系进程与线程的区别 任务(执行的代码)队列线程与队列的关系 队列任务**同步执行任务(sync)**辅助方法**异步执行任务(async)**总结栅栏任务迭代任务 队列详细属性QoSAttributes…...

学习c#的第十七天

目录 C# 异常处理 异常的原因 System.Exception 类 如何处理异常 常见的异常类 throw 语句 throw 表达式 try 语句 try-catch 语句 try-finally 语句 try-catch-finally 语句 when 异常筛选器 异步和迭代器方法中的异常 C# 异常处理 C # 中的异常提供了结构化、统…...

龙芯 操作系统选择和安装

龙芯3a5000及之后的cpu底层架构已经从mips64el改为了loongarch64 所以这里分了2种来说明,分别对应3a4000之前的和3a5000之后的 龙芯的系统安装难点在于操作系统的选取和引导 一、烧录工具 制作安装盘使用常规的烧录工具是不行滴,会提示没有\boot\initrd…...

【开源】基于JAVA的智能停车场管理系统

项目编号: S 005 ,文末获取源码。 \color{red}{项目编号:S005,文末获取源码。} 项目编号:S005,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系…...

使用IDEA 将Eclipse java工程转为maven格式

使用IDEA 将Eclipse java工程转为maven格式 ①使用idea打开项目,在项目根目录下右键选择 Add Framework Support 选择 maven ,引入maven ②找到项目中的.classpath文件或者lib目录 根据.classpath文件或者lib目录中列举的jar包名,将其依次手…...

CCF CSP认证 历年题目自练Day47

题目 试题编号: 201712-3 试题名称: Crontab 时间限制: 10.0s 内存限制: 256.0MB 样例输入 3 201711170032 201711222352 0 7 * * 1,3-5 get_up 30 23 * * Sat,Sun go_to_bed 15 12,18 * * * have_dinner 样例输出 201711170…...

LeetCode Hot100之十:239.滑动窗口最大值

题目 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 提示&#xff1a; 1 < nums.length < 10^5 -10^4 < nums[i…...

x264、x265、OpenH264 简要对比

一&#xff1a; x264、x265、OpenH264&#xff0c;都是开源代码库&#xff1b;二&#xff1a; H264(MPEG-4/AVC)、H265(HEVC)&#xff0c;是视频编码格式。是视频标准&#xff1b; H264(MPEG-4/AVC) 简称: H264 或 AVC&#xff1b; H265(HEVC) 简称: H265 …...

二维码智慧门牌管理系统升级解决方案:门牌聚合,让管理更便捷!

文章目录 前言一、传统门牌管理系统的瓶颈二、地图门牌聚合展示的优势三、地图门牌聚合展示的实现方法四、智慧门牌管理系统的未来发展 前言 随着城市的发展和建设&#xff0c;对于地址信息的管理变得越来越重要。而智慧门牌管理系统作为管理地址信息的重要工具&#xff0c;其…...

物联网AI MicroPython学习之语法UART通用异步通信

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; UART 介绍 模块功能: UART通过串行异步收发通信 接口说明 UART - 构建UART对象 函数原型&#xff1a;UART(id, baudrate&#xff0c;bits, parity&#xff0c;stop, tx, rx)参数说明&#xff1a; 参数类…...

Git企业开发级讲解(四)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、理解分⽀二、创建分支三、切换分⽀四、合并分⽀五、删除分⽀六、合并冲突七、分⽀管理策略…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...