【逆向执行】在Ubuntu20.04下搭建pomp环境

在 Ubuntu 20.04 下搭建 pomp 环境

pomp 只能分析 32 位程序。作者给出的编译方式只能用于在 32 位 Linux 环境下编译。我在 docker 中使用了 32 位的 ubuntu 镜像来编译 pomp,是可行的,但使用不太方便。我希望在 Ubuntu 20.04 下使用 IDE 源码调试 pomp。

编译定制过的 libdisasm-0.23

在编译 libdisasm-0.23 时,需要编译为 32 位可执行文件。

先安装一些依赖:

1
2
3
sudo apt-get install lib32z1
sudo apt-get install libelf-dev:i386 # 后缀 :i386 表示安装 32 位版本
sudo apt-get install gcc-multilib

然后对 libdisasm-0.23 进行编译。因为必须编译成 32 位的库文件,在参考了 在64为环境下用configure 产生32位的Makefile-wwm-ChinaUnix博客 之后,编译语句如下:

1
2
3
4
cd libdisasm-0.23
CC="gcc -m32 -march=i386 -mtune=i386" ./configure --prefix=`pwd`/build --target="i386-linux"
make
make install

此时,在 libdisasm-0.23/build/lib 目录下就会生成 libdisasm.a 和 libdisasm.so 文件,还生成了 include 目录。在 CmakeLists.txt 中我们会引用它们。

在 Clion 中编译 reverse-from-coredump

用 clion 打开 reverse-from-coredump 目录。由于源码并没有使用 cmake 组织,所以需要我手动编写一个 cmakelist。

根据 reverse-from-coredump/src/Makefile.am 的内容,可以看到编译 pomp 使用的源码文件包括:

1
handler_arithmetic.c handler_bit_manip.c handler_comparison.c handler_controlflow.c handler_logic.c handler_move.c handler_other.c handler_sse.c handler_stack.c handler_string.c handler_system.c handler_flag_manip.c handler_interrupt.c access_memory.c alias_manager.c common.c disassemble.c heuristics.c global.c inst_handle_resolve.c process_binary.c process_core.c process_inst_data.c process_thread.c re_dsmanager.c re_insttable.c re_mem_alias.c re_opdvalue.c reverse_log.c analyze_result.c reverse_execution.c reverse_instructions.c 

以及 reverse-from-coredump/include 目录下的所有文件。

所以在编写 CmakeLists.txt 中需要包括:

  • 上面提到的源码文件
  • reverse-from-coredump/include 目录下的所有文件
  • /usr/lib/i386-linux-gnu/libelf.a (即前面安装的 libelf-dev:i386)
  • libdisasm-0.23/build/lib/libdisasm.a (即前面手动编译的 libdisasm)

此外,还需要设置 CFLAGS 包含 "-m32 -msse4.1" ,参数 -msse4.1 是从 reverse-from-coredump/src/Makefile.am 里复制过来的。

编写 CmakeLists.txt 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
set(CMAKE_C_STANDARD)

cmake_minimum_required(VERSION 3.0)

set(CMAKE_C_FLAGS "-m32 -msse4.1 -DDEBUG")

project(reverse-from-coredump)

add_executable(reverse src/handler_arithmetic.c src/handler_bit_manip.c src/handler_comparison.c src/handler_controlflow.c src/handler_logic.c src/handler_move.c src/handler_other.c src/handler_sse.c src/handler_stack.c src/handler_string.c src/handler_system.c src/handler_flag_manip.c src/handler_interrupt.c src/access_memory.c src/alias_manager.c src/common.c src/disassemble.c src/heuristics.c src/global.c src/inst_handle_resolve.c src/process_binary.c src/process_core.c src/process_inst_data.c src/process_thread.c src/re_dsmanager.c src/re_insttable.c src/re_mem_alias.c src/re_opdvalue.c src/reverse_log.c src/analyze_result.c src/reverse_execution.c src/reverse_instructions.c)

target_include_directories(reverse
PRIVATE
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/../libdisasm-0.23/build/include
)

target_link_libraries(reverse
PRIVATE
/usr/lib/i386-linux-gnu/libelf.a
${PROJECT_SOURCE_DIR}/../libdisasm-0.23/build/lib/libdisasm.a
)

然后直接在 clion 中编译即可。

一开始没有加 -DDEBUG,导致运行时没有任何输出,害我调试很久。。