步驟:
先checksec,看一下開啟了什么保護
可以看到開啟了nx保護,然后把程序放入ida里面,觀察程序代碼
先shift+f12觀察是否有system和binsh函數
發現沒有system和binsh函數,所以我們考慮可以用libc泄露來做這道題
進入程序得主界面
在進入encrypt程序中按f5查看偽c代碼
我們可以看到程序對輸入得大小寫和字符等進行了一個簡單的加密,
注意if(v0>=strlen(s))可以跳出這個if循環
而strlen()函數的特性時讀取到\0時會結束所以我們可以payload前以\0開頭,從而繞過if加密
接下來我們判斷需要溢出的字符數量
可以看到需要88個字符可以造成溢出,而\0站一個字符所以我們在加上87個a就可以造成溢出
由此構建我們的exp
完整exp如下
注意:在第一個payload中我們需要讓程序獲得libc后能繼續返回到程序初,所以我們將返回地址設為了mian的地址
在第二個payload中,該程序在unbantu中的64位程序,所以我們還需要一個ret_addr來讓payload保持棧對齊
本地和遠程所獲得的libc版本是不一樣的,當本地失敗后,遠程試一下
成功獲得 flag