首页 > 解决方案 > 用 C 编写的反转共享库以使用 GDB 提取端口号

问题描述

我正在寻求 GDB 的帮助,以对预加载在 /etc/ld.so.preload 中的 C 语言编写的共享库进行反向工程。

如果源端口正确,则当前库挂钩 accept() 调用,它将反向 shell 返回给用户。

Strings 命令没有给出源端口,所以我的目标是尝试在 GDB 中找到它。

程序由两个文件 headers.h 组成,其中我有我的定义,变量#define SECRET_PORT 11111 source.c 包含带有反向外壳的接受钩子。

我的问题是我无法弄清楚如何在 GDB 中检索 PORT - 我可以在 gdb 中加载 mylib.so 并运行:info functions查看里面有什么 - 我可以看到接受功能,但是当我尝试时,disass accept我只能得到几乎不能的指令理解。

  1. 当我运行 mylib 时出现问题,它给出了 SIGSEGV(也许这就是我看不到变量的原因),没有设置 break 的主函数,如果我在函数接受上设置它,仍然会给出 SIGSEGV 错误。
  2. 我测试starti而不是运行然后我得到Program stopped 0xSOMEADRESGOESHERE in deregister_tm_clones()我什至不知道这是否是测试.so文件的正确方法。也许有一些 oser 开关。

我想我需要找到一种方法如何在 HTONS() 检查函数中设置 BP,其中 if 语句比较源端口并从那里提取值,但到目前为止还没有运气。

ps 当在 gdb 中加载 mylib 时,会出现消息没有找到调试符号。所以我不能像 list accept 或类似的东西来查看源代码。

编译代码gcc -Wall -shared -fPIC mylib.c -o mylib.so -ldl

标签: clinuxgdbreverse-engineering

解决方案


好的管理在帮助下解决这个问题

在共享库上运行 GDB 时,您必须检查 11111 的十六进制值,它应该是 2B67,因此在寄存器中这将变成类似 0x2b67 的东西,它将传递给 htons() 作为源端口检查。

所以让我们假设我没有仍然可以运行的源代码:gdb -q *.so then:info functions看看在disass functionNameGoesHere哪里进行了一些 accept / htons 调用。正确的值应该在 htons 线的正上方。然后将十六进制解码为 dec,这就是你如何找到它。

这需要一些时间才能弄清楚,因为我无法设置 BP。

再次感谢社区的投入!干杯


推荐阅读