• PostgreSQL Extension 开发环境搭建


    背景

    渗透测试涉及到 PostgreSQL(以下简称 PG) 的时候,如果已经拿到数据库 DBA 的账号和密码,那么就可以任意加载恶意动态库。就算最新版本的 PG 已经限制数据库只能从 C:\Program Files\PostgreSQL\xx\lib (windows)或者 /var/lib/postgresql/xx/lib 加载动态库,但是 DBA 还是可以用 Large Objects 这个特性随意写入动态库到指定的文件夹,然后加载。

    这篇文正我们看一下如何搭建 PostgreSQL Extension 在 Visual Studio 2022 下的开发环境。

    环境配置

    大家根据自己开发的版本,选择相应的文件下载,这个链接里可以找到老版本。

    下载之后解压或者安装,找到安装目录,接下来配置 Include Dir 会用。

    这里假设 PostgreSQL 9.3 的安装根目录在:

    C:\Program Files (x86)\PostgreSQL\9.3
    
    • 1

    开始配置,直接上图。

    1. 创建工程

    语言选择 C++,然后选择 Dynamic-Link Library (DLL)

    在这里插入图片描述
    没有安装 C++ 工具包的可以在 Visual Studio Installer 里面安装。

    在这里插入图片描述

    选择 Next,输入工程名,选择路径。

    在这里插入图片描述

    1. 添加源文件

    右键 Source Files,添加源文件。

    在这里插入图片描述

    另外两个自动生成的 cpp 文件可以删除。

    1. 设置编译架构

    根据目标 PG 架构,64位就选 x64

    在这里插入图片描述

    1. 配置其他环境变量

    右键工程名,选择属性。

    在这里插入图片描述

    Platform 和之前配置的架构一致。

    在这里插入图片描述

    选择 AdvancedCharacter Set -> Use Multi-Byte Character Set

    在这里插入图片描述

    选择 C/C++ -> General -> Additional Include Directories -> Edit

    在这里插入图片描述

    根据不同的安装目录,依次填写如下内容。

    C:\Program Files (x86)\PostgreSQL\9.3\include\server\port\win32_msvc
    C:\Program Files (x86)\PostgreSQL\9.3\include\server\port\win32
    C:\Program Files (x86)\PostgreSQL\9.3\include\server
    C:\Program Files (x86)\PostgreSQL\9.3\include
    
    • 1
    • 2
    • 3
    • 4

    选择 OK。其他设置默认。

    在这里插入图片描述

    选择 Preprocessor -> Preprocessor Definitions -> Edit

    在这里插入图片描述

    填写如下内容,并勾选 Inherit ... 选项。其他设置默认。

    WIN32
    
    • 1

    选择 OK

    在这里插入图片描述

    选择 Code Generation -> Enable C++ Exceptions

    设置为 No。其他配置默认。

    在这里插入图片描述

    选择 Precompiled Headers -> Precompiled Header

    设置为 Not Using Precompiled Headers。其他配置默认。

    在这里插入图片描述

    选择 Linker -> General -> Additional Library Directories -> Edit

    在这里插入图片描述

    根据安装目录,填写如下内容。

    C:\Program Files (x86)\PostgreSQL\9.3\lib
    
    • 1

    选择 OK

    在这里插入图片描述

    选择 Input -> Additional Dependencies -> Edit

    填写如下内容。

    postgres.lib
    
    • 1

    选择 OK

    在这里插入图片描述

    选择 Manifest File -> Generate Manifest

    设置为 No...。其他配置默认。

    在这里插入图片描述

    最后,选择 OK

    Include 都可以解析了。

    在这里插入图片描述

    编译也没有问题。

    在这里插入图片描述

    总结

    之前因为没有配置 Use Multi-Byte Character Set,编译可以通过但是会报这样的警告。

    1>C:\Users\...\pg_rev.c(31,28): warning C4133: 'function': incompatible types - from 'char [5]' to 'LPCWSTR'
    1>C:\Users\...\pg_rev.c(31,58): warning C4133: 'function': incompatible types - from 'Pointer' to 'LPCWSTR'
    
    • 1
    • 2

    在这里插入图片描述

    最终导致动态库无法执行任何命令。

    搜索发现是因为 Use Unicode Character Set 导致。所以,配置过程中一定记得设置 Character SetUse Multi-Byte Character Set

    KEEP CALM AND HACK AWAY!

  • 相关阅读:
    【校招VIP】前端JS之深拷贝和浅拷贝
    KBQA知识图谱问答
    18-spring 事务
    ZnDPA-Cy7 荧光细胞凋亡检测凋亡靶向探针
    钢铁异常检测背景 10篇论文摘要分享 小陈读paper系列
    驱动开发,stm32mp157a开发板的led灯控制实验(优化),使用ioctl函数,让write/read函数的专注读写功能
    vue2+vue3天禹老师版复习笔记
    Python进阶系列 - 20讲 with ... as:
    #【软件stm32cubeIDE下配置STM32F407uart1调试SBUS模块-学习笔记-基础样例-遥控小车与四轴模板】
    leetcode:55. 跳跃游戏【经典贪心】
  • 原文地址:https://blog.csdn.net/heisejiuhuche/article/details/126888170