Read auxv from proc rather than the stack
This commit is contained in:
parent
3582376f35
commit
2d4ffc703b
@ -490,29 +490,38 @@ class UploadThread: public IThread
|
|||||||
std::string vdsoOutputPath = "";
|
std::string vdsoOutputPath = "";
|
||||||
|
|
||||||
if (debugFile == "linux-gate.so") {
|
if (debugFile == "linux-gate.so") {
|
||||||
char vdsoOutputPathBuffer[512];
|
FILE *auxvFile = fopen("/proc/self/auxv", "rb");
|
||||||
g_pSM->BuildPath(Path_SM, vdsoOutputPathBuffer, sizeof(vdsoOutputPathBuffer), "data/dumps/linux-gate.so");
|
if (auxvFile) {
|
||||||
vdsoOutputPath = vdsoOutputPathBuffer;
|
char vdsoOutputPathBuffer[512];
|
||||||
int auxvStart = 0;
|
g_pSM->BuildPath(Path_SM, vdsoOutputPathBuffer, sizeof(vdsoOutputPathBuffer), "data/dumps/linux-gate.so");
|
||||||
while (environ[auxvStart++] != nullptr);
|
vdsoOutputPath = vdsoOutputPathBuffer;
|
||||||
struct {
|
|
||||||
int id;
|
while (!feof(auxvFile)) {
|
||||||
void *value;
|
int auxvEntryId = 0;
|
||||||
} *auxvEntry = (decltype(auxvEntry))&environ[auxvStart];
|
fread(&auxvEntryId, sizeof(auxvEntryId), 1, auxvFile);
|
||||||
for (int auxvIndex = 0; true; ++auxvIndex) {
|
long auxvEntryValue = 0;
|
||||||
if (auxvEntry[auxvIndex].id == 0) break;
|
fread(&auxvEntryValue, sizeof(auxvEntryValue), 1, auxvFile);
|
||||||
if (auxvEntry[auxvIndex].id != 33) continue; // AT_SYSINFO_EHDR
|
|
||||||
Elf32_Ehdr *vdsoHdr = (Elf32_Ehdr *)auxvEntry[auxvIndex].value;
|
if (auxvEntryId == 0) break;
|
||||||
auto vdsoSize = vdsoHdr->e_shoff + (vdsoHdr->e_shentsize * vdsoHdr->e_shnum);
|
if (auxvEntryId != 33) continue; // AT_SYSINFO_EHDR
|
||||||
void *vdsoBuffer = malloc(vdsoSize);
|
|
||||||
memcpy(vdsoBuffer, vdsoHdr, vdsoSize);
|
Elf32_Ehdr *vdsoHdr = (Elf32_Ehdr *)auxvEntryValue;
|
||||||
FILE *vdsoFile = fopen(vdsoOutputPath.c_str(), "wb");
|
auto vdsoSize = vdsoHdr->e_shoff + (vdsoHdr->e_shentsize * vdsoHdr->e_shnum);
|
||||||
if (vdsoFile) {
|
void *vdsoBuffer = malloc(vdsoSize);
|
||||||
fwrite(vdsoBuffer, 1, vdsoSize, vdsoFile);
|
memcpy(vdsoBuffer, vdsoHdr, vdsoSize);
|
||||||
fclose(vdsoFile);
|
|
||||||
debugFile = vdsoOutputPath;
|
FILE *vdsoFile = fopen(vdsoOutputPath.c_str(), "wb");
|
||||||
|
if (vdsoFile) {
|
||||||
|
fwrite(vdsoBuffer, 1, vdsoSize, vdsoFile);
|
||||||
|
fclose(vdsoFile);
|
||||||
|
debugFile = vdsoOutputPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(vdsoBuffer);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
free(vdsoBuffer);
|
|
||||||
|
fclose(auxvFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,30 +240,39 @@ int main(int argc, char *argv[])
|
|||||||
std::string vdsoOutputPath = "";
|
std::string vdsoOutputPath = "";
|
||||||
|
|
||||||
if (debugFile == "linux-gate.so") {
|
if (debugFile == "linux-gate.so") {
|
||||||
auto workingDir = getcwd(nullptr, 0);
|
FILE *auxvFile = fopen("/proc/self/auxv", "rb");
|
||||||
vdsoOutputPath = workingDir + std::string("/linux-gate.so");
|
if (auxvFile) {
|
||||||
int auxvStart = 0;
|
auto workingDir = getcwd(nullptr, 0);
|
||||||
while (environ[auxvStart++] != nullptr);
|
vdsoOutputPath = workingDir + std::string("/linux-gate.so");
|
||||||
struct {
|
free(workingDir);
|
||||||
int id;
|
|
||||||
void *value;
|
while (!feof(auxvFile)) {
|
||||||
} *auxvEntry = (decltype(auxvEntry))&environ[auxvStart];
|
int auxvEntryId = 0;
|
||||||
for (int auxvIndex = 0; true; ++auxvIndex) {
|
fread(&auxvEntryId, sizeof(auxvEntryId), 1, auxvFile);
|
||||||
if (auxvEntry[auxvIndex].id == 0) break;
|
long auxvEntryValue = 0;
|
||||||
if (auxvEntry[auxvIndex].id != 33) continue; // AT_SYSINFO_EHDR
|
fread(&auxvEntryValue, sizeof(auxvEntryValue), 1, auxvFile);
|
||||||
Elf32_Ehdr *vdsoHdr = (Elf32_Ehdr *)auxvEntry[auxvIndex].value;
|
|
||||||
auto vdsoSize = vdsoHdr->e_shoff + (vdsoHdr->e_shentsize * vdsoHdr->e_shnum);
|
if (auxvEntryId == 0) break;
|
||||||
void *vdsoBuffer = malloc(vdsoSize);
|
if (auxvEntryId != 33) continue; // AT_SYSINFO_EHDR
|
||||||
memcpy(vdsoBuffer, vdsoHdr, vdsoSize);
|
|
||||||
FILE *vdsoFile = fopen(vdsoOutputPath.c_str(), "wb");
|
Elf32_Ehdr *vdsoHdr = (Elf32_Ehdr *)auxvEntryValue;
|
||||||
if (vdsoFile) {
|
auto vdsoSize = vdsoHdr->e_shoff + (vdsoHdr->e_shentsize * vdsoHdr->e_shnum);
|
||||||
fwrite(vdsoBuffer, 1, vdsoSize, vdsoFile);
|
void *vdsoBuffer = malloc(vdsoSize);
|
||||||
fclose(vdsoFile);
|
memcpy(vdsoBuffer, vdsoHdr, vdsoSize);
|
||||||
debugFile = vdsoOutputPath;
|
|
||||||
|
FILE *vdsoFile = fopen(vdsoOutputPath.c_str(), "wb");
|
||||||
|
if (vdsoFile) {
|
||||||
|
fwrite(vdsoBuffer, 1, vdsoSize, vdsoFile);
|
||||||
|
fclose(vdsoFile);
|
||||||
|
debugFile = vdsoOutputPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(vdsoBuffer);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
free(vdsoBuffer);
|
|
||||||
|
fclose(auxvFile);
|
||||||
}
|
}
|
||||||
free(workingDir);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debugFile[0] != '/') {
|
if (debugFile[0] != '/') {
|
||||||
|
Loading…
Reference in New Issue
Block a user