Read auxv from proc rather than the stack

This commit is contained in:
Asher Baker 2019-01-12 01:33:10 +00:00
parent 3582376f35
commit 2d4ffc703b
2 changed files with 62 additions and 44 deletions

View File

@ -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);
} }
} }

View File

@ -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] != '/') {