mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 16:36:21 +00:00
66 lines
1.4 KiB
C
66 lines
1.4 KiB
C
#include <procfs.h>
|
|
#include <stdio.h>
|
|
|
|
#define ARRAY_LENGTH(array) (sizeof((array)) / sizeof(0[(array)]))
|
|
|
|
int main(void)
|
|
{
|
|
int res = 1;
|
|
FILE *fi = NULL;
|
|
prxmap_t map[32];
|
|
int found = 0;
|
|
int done = 0;
|
|
/* Obtain an address inside the stack using a dirty trick. */
|
|
uintptr_t local = (uintptr_t)&fi;
|
|
|
|
/* Open /proc/self/xmap for reading. */
|
|
fi = fopen("/proc/self/xmap", "r");
|
|
if (!fi) {
|
|
perror("fopen");
|
|
goto out;
|
|
}
|
|
|
|
/* Read the file until EOF or the stack is found. */
|
|
while (!done && !found) {
|
|
size_t i, items;
|
|
|
|
items = fread(map, sizeof(map[0]), ARRAY_LENGTH(map), fi);
|
|
if (items != ARRAY_LENGTH(map)) {
|
|
if (ferror(fi)) {
|
|
perror("fread");
|
|
goto out;
|
|
}
|
|
done = 1;
|
|
}
|
|
|
|
/* Scan the read mappings. */
|
|
for (i = 0; i < items; i++)
|
|
if (map[i].pr_vaddr <= local
|
|
&& local < map[i].pr_vaddr + map[i].pr_size) {
|
|
/* Stack was found, validate it. */
|
|
found = 1;
|
|
if ((map[i].pr_mflags & (MA_READ | MA_WRITE | MA_EXEC))
|
|
!= (MA_READ | MA_WRITE)) {
|
|
fprintf(stderr, "Incorrect stack mapping detected.\n");
|
|
goto out;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Check if the stack was indeed found. */
|
|
if (!found) {
|
|
fprintf(stderr, "Stack not found.\n");
|
|
goto out;
|
|
}
|
|
|
|
res = 0;
|
|
|
|
out:
|
|
/* Cleanup. */
|
|
if (fi)
|
|
fclose(fi);
|
|
|
|
return res;
|
|
}
|
|
|