用C编写的反向共享库用GDB提取端口号
我正在寻找GDB的帮助,以便对预加载在/etc/ld.so.preload中的用C编写的共享库进行反向工程 当前库hooks accept()调用如果源端口正确,它会将反向shell返回给用户 Strings命令并没有给出源端口,所以我的目标是尝试在GDB中找到它 程序由两个文件头.h组成,其中有我的定义和变量用C编写的反向共享库用GDB提取端口号,c,linux,gdb,reverse-engineering,C,Linux,Gdb,Reverse Engineering,我正在寻找GDB的帮助,以便对预加载在/etc/ld.so.preload中的用C编写的共享库进行反向工程 当前库hooks accept()调用如果源端口正确,它会将反向shell返回给用户 Strings命令并没有给出源端口,所以我的目标是尝试在GDB中找到它 程序由两个文件头.h组成,其中有我的定义和变量#define SECRET_端口11111 c包含带反向shell的accept钩子 我的问题是我无法找到在GDB中检索端口的方法-我可以加载mylib。因此在GDB中运行:info f
#define SECRET_端口11111
c包含带反向shell的accept钩子
我的问题是我无法找到在GDB中检索端口的方法-我可以加载mylib。因此在GDB中运行:
info functions
查看内部内容-我可以查看accept函数,但当我尝试disass accept
时,我只能得到我几乎无法理解的指令
starti
而不是run进行测试,然后我在deregister\u tm\u clones()中停止了程序0xsomeadresgoesher
我甚至不知道这是否是测试.so文件的正确方法。也许有一些oser开关gcc-Wall-shared-fPIC mylib.c-o mylib.so-ldl
我想我需要找到一种方法,在HTONS()检查函数中设置BP,其中if语句比较源端口并从中提取值
您不需要这样做——无论是运行应用程序还是在不运行的情况下反汇编函数,指令都是相同的
编译代码
因此,您正在尝试对您拥有源代码的库进行反向工程?这使得你很容易找到你想要的常数 首先将常数设置为易于识别的值,例如
0x12131415
。编译库并反汇编它。寻找你的常数
如果看不到,请保存分解后的输出,并使用其他值重新生成库,例如0xA1B1C1D1
。再次拆解,并与先前拆解的输出进行比较。应该很容易看出区别
另外,如果您真的想用实时进程调试此库,请执行以下操作:
gdb ./myprog
(gdb) set env LD_PRELOAD /path/to/mylib.so
(gdb) run
此时,您应该能够设置断点并观察“正在运行”的库。确定并通过帮助解决此问题 在共享库上运行GDB时,您必须检查11111的十六进制值,它应该是2B67,因此在寄存器中这将变成类似0x2b67的值&它将作为源端口检查传递给htons() 所以让我们假设我没有仍然可以运行的源代码:
gdb-q*.So
然后:info functions
,并查看使用disass functionnamegoesher
进行一些accept/htons调用的地方。应在htons线正上方找到正确的值。
然后将十六进制解码为dec,这就是你可以找到它的方式
这花了一些时间才弄清楚,因为我无法设置BP
再次感谢社区的投入!干杯>我只收到我几乎无法理解的指令,理解指令是逆向工程的必要条件。您可以找到检查提供的端口值的指令,并将其与
SECRET\u port
进行比较。在其他任何地方都找不到常量本身,更不用说它的名称了,它在预处理过程中(甚至在实际编译之前)消失了。在应用程序上运行strace
。@numzero是的,我理解。虽然没有太多的经验,但我可以在disass接受指令列表中看到以下两件事htons@plt还有“cmp%ax,%bx”,之后是jne 0x1345和测试$eax,$eax-我已经尝试运行mylib,然后“信息寄存器$eax”给了我0xf7ffe0a8-134225752(我无法确定我是否得到带有0x000…01的瞬时SIGSEGV故障是正确行为还是不正确)可能这些cmp/测试检查没有填充anything@kaylum它对strace不起作用,但ltrace做到了我能看到的技巧,例如运行一些包含mylib的文件,我看到函数调用与一些地址谢谢你的投入-将尝试这种方法,并报告它是如何工作的。