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上的总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

036、目标检测-锚框

之——对边缘框的简化 目录 之——对边缘框的简化 杂谈 正文 1.锚框操作 2.IoU交并比 3.锚框标号 4.非极大值抑制 5.实现 拓展 杂谈 边缘框这样一个指定roi区域的操作对卷积神经网络实际上是很不友好的,这可能会对网络感受野提出一些特定的要求&#xff0…

【脑与认知科学】【n-back游戏】

请参考课堂内容,设计一种测试工作记忆的实验方法,并选择三位同学作为被试测试工作记忆。请画出实验流程图,叙述实验测试目标,并分析实验结果。 举例:一般我们选择n_back来测试对数字或字母的记忆,选择色块实…

[深度学习]卷积神经网络的概念,入门构建(代码实例)

# 不再任何人,任何组织的身上倾注任何的感情,或许这就是能活得更开心的办法 0.写在前面: 卷积神经网络的部分在之前就已经有所接触,这里重新更全面地总结一下关于深度学习中卷积神经网络的部分.并且在这里对如何构建代码,一些新的思想和网络做出一点点补充,同时会持续更新一些…

传递函数的推导和理解

传递函数的推导和理解 假设有一个线性系统,在一般情况下,它的激励 x ( t ) x(t) x(t)与响应 y ( t ) y(t) y(t)所满足的的关系,可用下列微分方程来表示: a n y ( n ) a n − 1 y ( n − 1 ) a n − 2 y ( n − 2 ) ⋯ a 1 y…

k8s上Pod生命周期、重启策略、容器探测简介

目录 一.Pod的创建过程 二.Pod的终止过程 三.Pod的重启策略(restartPolicy) 1.Always 2.OnFailture 3.Never 4.示例 四.Pod生命周期内的5种状态(相位) 1.Pending 2.Running 3.Succeeded 4.Failed 5.Unknown 五.初始…

SpringCache

1、基本信息 Spring缓存方案:JDK内置的缓存(ConcurrentHashMap)、第三方缓存组件(Caffeine)、分布式的缓存实现(Memcahed、Redis)。 ConcurrentHashMap是JUC之中提供最为重要的技术实现。SpringCache之中为了便于缓存结构的管理,在“org.s…

flutter TabBar指示器

第一层tabView import package:jade/configs/PathConfig.dart; import package:jade/customWidget/MyCustomIndicator.dart; importpackage:jade/homePage/promotion/promotionPost/MyPromotionListMainDesc.dart; import package:jade/homePage/promotion/promotionPost/MyPr…

C++入门(1)—命名空间、缺省参数

目录 一、什么是C 1、C关键字(C98) 2、C兼容C 二、C程序预处理指令 三、命名空间 1、命名冲突 第一种: 第二种: 2、域作用限定符 3、实现命名空间 4、命名空间冲突 5、访问命名空间 6、命名空间“std” 四、输入输出 1、定义 2、自动识…

生活总是自己的,请尽情打扮,尽情可爱,,

同色系拼接羽绒服了解一下 穿上时尚感一下子就突显出来了 90白鸭绒填充,不仅时尚还保暖 设计感满满的羽绒服不考虑一下吗?

腾讯云服务器租用价格,腾讯云服务器价格流量怎么算?

首先,让我们来看看腾讯云服务器租用价格。根据您的需求不同,腾讯云提供了多种不同的配置选项,从轻量级应用服务器到高性能的GPU服务器,都可以满足您的需求。以下是一些常见的腾讯云服务器租用价格: 一、腾讯云服务器租…

Mysql-复合查询

实际开发中往往数据来自不同的表,所以需要多表查询。 1.笛卡尔积 通俗来讲就是两个表的每一列都组合一遍,也就是穷举法。 穷举出来的数据表会有大量重复数据,而我们只需要加上一些限定条件就可以完成有效数据的筛选。 select EMP.ename, EM…

解决:虚拟机远程连接失败

问题 使用FinalShell远程连接虚拟机的时候连接不上 发现 虚拟机用的VMware,Linux发行版是CentOs 7,发现在虚拟机中使用ping www.baidu.com是成功的,但是使用FinalShell远程连接不上虚拟机,本地网络也ping不通虚拟机&#xff0c…

STM32 I2C详解

STM32 I2C详解 I2C简介 I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线 两根通信线: SCL(Serial Clock)串行时钟线,使用同步的时序,降低对硬件的依赖,同时同步的时序稳定…

【UE5】显示或隐藏物体轮廓线

效果 步骤 1. 先下载所需的材质文件“M_Highlight.uasset” 材质下载链接: 链接:https://pan.baidu.com/s/1rxmRhkUoXVq6-DkIKyBhAQ 提取码:55bv 2. 在视口中拖入后期处理体积 根据需求设置后期处理体积的大小或者直接设置无限范围&…

python爬取网站数据,作为后端数据

一. 内容简介 python爬取网站数据,作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接: 三.主要流程 3.1 通过urllib请求网站 里面用的所有的包 ! pip install lxml ! pip install selenium ! pip install…

【Linux】U盘安装的cfg引导文件配置

isolinux.cfg文件 default vesamenu.c32 timeout 600display boot.msg# Clear the screen when exiting the menu, instead of leaving the menu displayed. # For vesamenu, this means the graphical background is still displayed without # the menu itself for as long …

计算两个图形遮盖率

读取图像 首先,加载待处理的图像,可以使用图像处理库(例如OpenCV)来实现这一步。确保已加载正确的图像。 定义特定颜色范围 确定所需的特定颜色范围。这将是要检测的马赛克填充的颜色。需要指定颜色的下限值和上限值,通…

深度学习中文汉字识别 计算机竞赛

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习中文汉字识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xf…

快速搭建本地的chatgpt

快速搭建本地的chatgpt 参考:一篇文章教你使用Docker本地化部署Chatgpt(非api,速度非常快!!!)及裸连GPT的方式(告别镜像GPT)-CSDN博客 前提是linux下 已安装docker 命…

Leetcode—142.环形链表II【中等】

2023每日刷题(三十三) Leetcode—142.环形链表II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* …