簡體   English   中英

如何讀取C程序的堆棧段?

[英]How to read the stack segment of a C program?

我正在開發一個 Hobby 操作系統,為此我想知道 Linux 中的內存分配機制,為了理解這一點,我創建了一個簡單的 C 程序,它定義了一些十六進制數的unsigned char ,然后在一個空的無限循環中運行,我這樣做是為了讓這個過程保持活力。 然后我使用pmap來獲取頁面映射信息。 現在我知道堆棧段的位置,我還創建了一個程序,它使用process_vm_readv系統調用來讀取該地址的內容,當我讀取堆棧段的內容和一些隨機數時,我看到的都是00流,最后如何我能弄清楚數組是如何存儲在堆棧段中的嗎?

如果可能,我如何分析十六進制流以提取有意義的信息?

在這里,我添加了一個訪問遠程進程地址空間的演示,有兩個程序 local.c 將在另一個名為 remote.c 的程序中讀取和寫入變量(這些程序假定sizeof(int)==4

本地文件

#define _GNU_SOURCE
#include <sys/uio.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/syscall.h>

int main()
{
    char buf[4];
    struct iovec local[1];
    struct iovec remote[1];
    int pid;
    void *addr;

    printf("Enter remote pid\n");
    scanf("%d",&pid);

    printf("Enter remote address\n");
    scanf("%p", &addr);

    local[0].iov_base = buf;
    local[0].iov_len = 4;

    remote[0].iov_base = addr;
    remote[0].iov_len = 4;



    if(syscall(SYS_process_vm_readv,pid,local,1,remote,1,0) == -1) {
    perror("");
        return -1;
    }
    printf("read : %d\n",*(int*)buf);

    *(int*)buf = 4321;

    if(syscall(SYS_process_vm_writev,pid,local,1,remote,1,0) == -1) {
    perror("");
        return -1;
    }
    return 0;
}

遠程文件

#define _GNU_SOURCE
#include <sys/uio.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/syscall.h>

int main()
{

    int a = 1234;

    printf("%d  %p\n",getpid(),&a);
    while(a == 1234);

    printf ("'a' changed to %d\n",a);
    return 0;
}

如果你在 Linux 機器上運行它,

[ajith@localhost Desktop]$ gcc remote.c -o remote -Wall
[ajith@localhost Desktop]$ ./remote
4574  0x7fffc4f4eb6c
'a' changed to 4321
[ajith@localhost Desktop]$


[ajith@localhost Desktop]$ gcc local.c -o local -Wall
[ajith@localhost Desktop]$ ./local
Enter remote pid
4574
Enter remote address
0x7fffc4f4eb6c
read : 1234
[ajith@localhost Desktop]$

使用類似的方法可以將堆棧幀讀取到 io-vectors,但是您需要知道堆棧幀結構格式才能從堆棧幀解析局部變量的值。 棧幀包含函數參數、返回地址、局部變量等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM