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