Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C编写的反向共享库用GDB提取端口号_C_Linux_Gdb_Reverse Engineering - Fatal编程技术网

用C编写的反向共享库用GDB提取端口号

用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

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

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

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

程序由两个文件头.h组成,其中有我的定义和变量
#define SECRET_端口11111
c包含带反向shell的accept钩子


我的问题是我无法找到在GDB中检索端口的方法-我可以加载mylib。因此在GDB中运行:
info functions
查看内部内容-我可以查看accept函数,但当我尝试
disass accept
时,我只能得到我几乎无法理解的指令

  • 问题当我运行mylib时,它给出了SIGSEGV(也许这就是我看不到变量的原因)没有设置break的主函数,如果我在函数accept上设置它,它仍然给出SIGSEGV错误
  • 我用
    starti
    而不是run进行测试,然后我在deregister\u tm\u clones()中停止了
    程序0xsomeadresgoesher
    我甚至不知道这是否是测试.so文件的正确方法。也许有一些oser开关
  • 我想我需要找到一种方法,如何在HTONS()检查函数中设置BP,其中if语句比较源端口并从中提取值,但到目前为止还没有成功

    p、 当mylib加载到gdb中时,没有找到调试符号的消息。因此,我不能像list accept或类似的方式运行来查看源代码

    编译代码
    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的文件,我看到函数调用与一些地址谢谢你的投入-将尝试这种方法,并报告它是如何工作的。