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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

Qyouu 2021-04-09 13:15:48
我試圖編寫一個(gè)函數(shù)來(lái)復(fù)制一個(gè)函數(shù)(并最終修改其程序集)并返回它。對(duì)于一個(gè)間接級(jí)別來(lái)說,這很好用,但在兩個(gè)級(jí)別上,我都遇到了段錯(cuò)誤。這是一個(gè)最小的(不)工作示例:#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;}我可以一次將內(nèi)存轉(zhuǎn)移到mmap'ed區(qū)域中,以創(chuàng)建一個(gè)可以稱為(g()())的有效函數(shù)。但是,如果我嘗試再次應(yīng)用(h()()()),則會(huì)出現(xiàn)段錯(cuò)誤。我已經(jīng)確認(rèn)它可以正確創(chuàng)建的復(fù)制版本g,但是當(dāng)我執(zhí)行該版本時(shí),就會(huì)出現(xiàn)段錯(cuò)誤。我為什么不能在一個(gè)mmap'ed區(qū)域中執(zhí)行代碼而又不能在另一個(gè)mmap'ed區(qū)域中執(zhí)行代碼呢?從帶有x/i檢查的探索性gdb-ing看來(lái),我可以成功調(diào)用,但是當(dāng)我返回該函數(shù)時(shí),我所來(lái)自的函數(shù)已被擦除并替換為0。如何使這種行為起作用?可能嗎?
查看完整描述

3 回答

  • 3 回答
  • 0 關(guān)注
  • 374 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)