2013-08-21 77 views
1

我使用gcc編譯了C代碼,當我使用readelf檢查ELF的各個部分時,我可以看到.data部分的標誌設置爲WA(可寫入和可分配)。ELF修改部分標誌

是否可以修改這些標誌?我可以使這部分可執行嗎?

我正在使用gdb來調試這個二進制文件,我想將.data節的標誌設置爲可執行文件在某個點。那麼,這可以使用gdb或gcc來完成嗎?

回答

3

是否可以修改這些標誌?我可以使這部分可執行嗎?

是的。如果你想這樣做一次性,最簡單的方法可能是將源代碼編譯爲程序集,並修改那裏的段屬性,然後像往常一樣將程序集編譯成目標文件和鏈接。

我正在使用gdb來調試這個二進制文件,並且我想將.data節的標誌設置爲可執行文件在某個點。

你也可以在GDB中調用mprotect(addr, len, PROT_READ|PROT_WRITE|PROT_EXEC)

注:修改標誌在.data部分二進制一直掛後會有任何作用:內核看的部分,只有在PT_LOAD

如何在彙編代碼中將數據段標記爲可執行文件?我想,像這樣:.section .data,「awx」,@ progbits。

是的,看起來是正確的。它沒有工作嗎?

的mprotect()未找到

是您的可執行靜態鏈接?如果沒有,應找到mprotect(位於libc.so),並且您可能有GDB錯誤。如果您首先登錄print &mprotect,可能會幫助GDB找到mprotect

另請注意:mprotect(0x0804a020, 80, PROT_READ, PROT_WRITE, PROT_EXEC)與我所建議的非常不同(mprotect需要3個參數,而不是5)。您還需要仔細閱讀man mprotect - 它需要起始地址爲頁面對齊。

+0

謝謝。你能告訴一個關於如何在彙編代碼中將數據段標記爲可執行文件的例子嗎?我想,像這樣:.section .data,「awx」,@ progbits。此外,我嘗試使用gdb內的mprotect調用(同時調試二進制main()子例程)如下所示:mprotect(0x0804a020,80,PROT_READ,PROT_WRITE,PROT_EXEC),它說,找不到mprotect()。 –

+0

@NeonFlash我已經更新了答案。 –