PWN5 BUU
CGfsb 攻防世界
@TOC
CGfsb 攻防世界
file checksec
ida32,输入一个name,留下一段message,两处都无法直接溢出,往下看,printf(&s),缺少了格式化字符串参数,而由于printf会把(gdb中0004位置)的参数当作格式化字符串,后面的作为&s,&buf这样的地址参数,
1 | printf格式化说明符: |
利用%n可以修改内存中的数据
至于printf函数中参数位置,偏移等等,放两张图,大家感受一下
gdb stack中0004位置是printf的格式化字符串参数,并且其中确定了需要使用的接下来的参数位置,如果是%10$n就是使用接下来第十个参数进行相应解析,如果没有数字,%p,就是使用接下来第一个参数进行相应解析。
而在进程中,0004位置实际上并不是格式化字符串的真实地址,只是指针指向了格式化字符串的真实地址,因此我们只要找到偏移量,就可以将利用将我们输入的(地址+aaaa%[偏移量]$n),我们只输入了一次数据,但因为 %[偏移量]$n 相当于利用了两次输入,即补全了格式化字符串,又使用了我们想要使用的参数
找到pwnme的地址
bss段可写
脚本
1 | #!/usr/bin/env python3 |
PWN5 BUU
file checksec
ida32,我们看到最下面if语句里面有system(“/bin/sh”),所以我们只需要让判断成立即可,atoi(&nptr) == unk_804C044,atoi函数是将字符串转化为相应的数字,例如:atoi(“1213”)=1213,往上看,发现unk_804C044是从”/dev/urandom”里面读出来的,是随机数,所以我们无法直接找到一个值,输入进nptr。
但我们发现printf(&buf),没有格式化字符串,并且buf是我们可以输入的字符串。
点进去unk_804C044,发现在bss段
查看段,发现bss段可写
我们可以利用此处的漏洞,将unk_804C044修改为一个固定的值,再在passwd处输入一个相同的值,就可以进入if,得到权限了。
gdb pwn5
由上面两图中都可以看出偏移为10
脚本
1 | #!/usr/bin/env python3 |
-------------本文结束感谢您的阅读-------------