微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反转用C编写的共享库以使用GDB提取端口号

如何解决反转用C编写的共享库以使用GDB提取端口号

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

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

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

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

我的问题是我不知道如何在GDB中检索PORT-我可以在gdb中加载mylib.so并运行:info functions以查看其中的内容-我可以看到accept函数,但是当我尝试disass accept我只会得到我几乎听不懂的指示。

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

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

p.s。将mylib加载到gdb中时,显示消息未找到调试符号。因此,我无法像列表接受那样运行,也不能像这样来查看源代码

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

解决方法

我想我需要找到一种方法来在HTONS()检查函数中设置BP,如果if语句比较源端口并从中提取值

不需要需要执行此操作-无论您运行应用程序还是不使用功能反汇编,指令都将与相同 >运行。

编译代码...

因此,您正在尝试对具有其来源的库进行反向工程?
这使得非常容易找到您要寻找的常数。

首先将常数设置为易于识别的值,例如0x12131415。编译库并将其反汇编。寻找你的常数。

如果看不到,请保存反汇编的输出,然后使用其他值重建库,例如0xA1B1C1D1。再次将其拆解并与先前的拆解输出进行比较。应该容易发现差异。

P.S。如果您真的要使用实时进程调试该库,请执行以下操作:

gdb ./myprog
(gdb) set env LD_PRELOAD /path/to/mylib.so
(gdb) run

这时,您应该能够设置断点并观察“运行中”的库。

,

确定可以在帮助下解决此问题

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

因此,假设我没有仍可以运行的源代码:gdb -q *.so 然后:info functions,并在disass functionNameGoesHere处看到进行了一些accept / htons呼叫。正确的值应该在htons线上方找到。 然后将十六进制解码为dec,这就是找到它的方式。

花了一些时间才弄清楚,因为我没有设置BP。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。