Linux LD_PRELOAD 技术介绍

Linux LD_PRELOAD 技术介绍

LD_PRELOAD是Linux/Unix系统的一个环境变量,它可以影响程序的运行时的链接,它允许在程序运行前定义优先加载的动态链接库。通过这个环境变量,可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖系统的函数库。

具体来说, Linux操作系统的动态链接库在加载过程中,动态链接器会先读取LD_PRELOAD环境变量和默认配置文件/etc/ld.so.preload,并将读取到的动态链接库文件进行预加载。即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被加载,因为它们的优先级比LD_LIBRARY_PATH环境变量所定义的链接库查找路径的文件优先级要高,所以能够提前于用户调用的动态库载入。

Linux 反弹Shell

Linux 反弹Shell

在渗透测试实战中,我们经常会遇到Linux系统环境,而让Linux主机反弹个shell是再常见不过的事情了。

反弹shell,就是攻击机监听在某个TCP/UDP端口为服务端,目标机主动发起请求到攻击机监听的端口,并将其命令行的输入输出转到攻击机。

Linux 中C/C++代码通过函数名称字符串发起调用

Linux 中C/C++代码通过函数名称字符串发起调用

分两种情况:

  // 打开动态链接库
    void* handle = dlopen("demo.so", RTLD_LAZY);
    if (!handle) {
        fprintf(stderr, "无法打开动态链接库: %s\n", dlerror());
        return ;
    }

    // 获取函数地址
    void (*myFunction)() = dlsym(handle, "__gcov_dump");
    if (!myFunction) {
        fprintf(stderr, "无法获取函数地址: %s\n", dlerror());
        dlclose(handle);
        return ;
    }
    fprintf(stderr, "gcov_dump addr:%p\n", myFunction);

    // 调用函数
    myFunction();

    // 关闭动态链接库
    dlclose(handle);

主模块(编译成 .out 的那个二进制模块)当中的符号,和普通的动态库 .so当中的不同。普通的动态库中的符号,只要没有static 限制为未局部的,都会成为导出符号,出现在 .dynsym 当中。但是,主模块呢,只有在其他模块,比如 A .so中使用和主模块中同名的符号(不论这个符号在A.so 还是 B.so 当中是否有定义),主模块的符号才会成为导出符号,出现在 .dynsym 当中。

Linux 中的虚拟网络接口

Linux 中的虚拟网络接口

  • 对应 char 设备 /dev/net/tun
  • 操作系统内核中的虚拟网络设备,用户层程序提供数据的接收与传输。
  • 普通的物理网络接口如 eth0,它的两端分别是内核协议栈和外面的物理网络。而对于 TUN/TAP 虚拟接口如 tun0,它的一端一定是连接的用户层程序,另一端则视配置方式的不同而变化,可以直连内核协议栈,也可以是某个 bridge。
  • TUN 和 TAP 的区别在于工作的网络层次不同,用户程序通过 TUN 设备只能读写网络层的 IP 数据包, 而 TAP 设备则支持读写链路层的数据包(通常是以太网数据包,带有 Ethernet headers)。
  • TUN 与 TAP 的关系,就类似于 socket 和 raw socket.
  • TUN/TAP 应用最多的场景是 VPN 代理,比如:clash、tun2socks。

即 IPv4 in IPv4,在 IPv4 报文的基础上再封装一个 IPv4 报文。

Mac 重装系统

Mac 重装系统

电脑关机状态下,键盘长按command+R键不放,同时按一下开机键松手,此时继续长按command+R键不放。等待出现苹果图标后松手。