BUUCTF not_the_same_3dsctf_2016
生活随笔
收集整理的這篇文章主要介紹了
BUUCTF not_the_same_3dsctf_2016
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
還是靜態鏈接的,一個文件,自己玩,所以打開IDA找找能用到的函數就可以了,題目也非常簡單,棧溢出
這里我特別解釋一下這個payload'a'.encode() * (0x2d) + p32(mprotect_addr) + p32(pop) + p32(bss_start_addr) + p32(0x100) + p32(0x7) + p32(read_addr) + p32(bss_start_addr) + p32(0) + p32(bss_start_addr) + p32(0x100)
- 首先0x2d是main函數中棧空間的大小,它的下一個位置就是ret指令對應的返回地址了
- p32(mprotect_addr)就是mprotect函數的地址,接下來的p32(pop)是為了保持棧平衡而將后面壓入的三個參數從棧上彈出,彈出后我們并不使用它,就是為了控制棧的結構,p32(pop)的位置也同樣是執行完mprotect后的返回地址,pop對應的指令為pop esi ; pop edi ; pop ebp ; ret,最后ret就跳轉到p32(read_addr)這里了
- 同理,p32(read_addr)的下一個p32(bss_start_addr)也是執行完read函數后跳轉的地址,后面是read的三個參數
整個思路就是,利用mprotect函數修改bss段為0x7即0b111,可讀可寫可執行權限,然后利用read函數讀入shellcode,最后跳轉到shellcode的位置,就成功拿到shell了
總結
以上是生活随笔為你收集整理的BUUCTF not_the_same_3dsctf_2016的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZF标志
- 下一篇: ERP的概念、简介与发展历程