如何解决反转用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
我只会得到我几乎听不懂的指示。
- 我运行mylib时出现问题,它给出了SIGSEGV(也许是我看不到变量的原因),没有在哪里设置中断的主函数,如果我在函数accept上设置它,仍然会给出SIGSEGV错误。
- 我使用
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 举报,一经查实,本站将立刻删除。