第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在mmap中執(zhí)行代碼以生成可執(zhí)行代碼段錯誤

在mmap中執(zhí)行代碼以生成可執(zhí)行代碼段錯誤

Qyouu 2021-04-09 13:15:48
我試圖編寫一個函數(shù)來復制一個函數(shù)(并最終修改其程序集)并返回它。對于一個間接級別來說,這很好用,但在兩個級別上,我都遇到了段錯誤。這是一個最小的(不)工作示例:#include <stdio.h>#include <string.h>#include <sys/mman.h>#define BODY_SIZE 100int f(void) { return 42; }int (*G(void))(void) { return f; }int (*(*H(void))(void))(void) { return G; }int (*g(void))(void) {    void *r = mmap(0, BODY_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);    memcpy(r, f, BODY_SIZE);    return r;}int (*(*h(void))(void))(void) {    void *r = mmap(0, BODY_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);    memcpy(r, g, BODY_SIZE);    return r;}int main() {    printf("%d\n", f());    printf("%d\n", G()());    printf("%d\n", g()());    printf("%d\n", H()()());    printf("%d\n", h()()()); // This one fails - why?    return 0;}我可以一次將內存轉移到mmap'ed區(qū)域中,以創(chuàng)建一個可以稱為(g()())的有效函數(shù)。但是,如果我嘗試再次應用(h()()()),則會出現(xiàn)段錯誤。我已經(jīng)確認它可以正確創(chuàng)建的復制版本g,但是當我執(zhí)行該版本時,就會出現(xiàn)段錯誤。我為什么不能在一個mmap'ed區(qū)域中執(zhí)行代碼而又不能在另一個mmap'ed區(qū)域中執(zhí)行代碼呢?從帶有x/i檢查的探索性gdb-ing看來,我可以成功調用,但是當我返回該函數(shù)時,我所來自的函數(shù)已被擦除并替換為0。如何使這種行為起作用?可能嗎?
查看完整描述

3 回答

  • 3 回答
  • 0 關注
  • 365 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號