我对在称为trace-p的crackme中实现的反调试方法感兴趣。子进程是派生的,它使用int3指令与父进程进行通信。我想调试孩子。 gdb具有set follow-fork-mode,但是gdb无法将文件识别为可执行文件(可能是由于删除了与节有关的信息)。使用radare2,我可以分解甚至调试,但是在叉发生后,我不知道如何跟随孩子。我要这样做是因为孩子包含以下指令:

0x0804898a    jmp dword [edx*4 + 0x8049334]


我想在那里停下来检查edx,以了解跳转的位置。 >
我对能够调试子进程的任何工具或方法都很感兴趣。

#1 楼

发生派生时,使用dbg.forks=true停止调试器。然后使用dp列出并选择您要跟踪的pid。

#2 楼

使用radee2的第一件事是确保您正在运行最新的git版本。要获得有关radee2中命令的帮助,可以使用?字符。要获取有关配置变量的帮助,可以使用e??(因为e?会为您提供有关如何使用它们的帮助,而不是列出它们)。由于变量很多,您可以使用内部grep命令对其进行过滤: >
很显然,您要查找的变量是~,将其设置为true:遇到e dbg.<tab>时,它将停止该过程。您可以使用dbg.fork-命令更改pid:

[0x00000000]> e??dbg
          dbg.args: Set the args of the program to debug
       dbg.backend: Select the debugger backend
           dbg.bep: break on entrypoint (loader, entry, constructor, main)
      dbg.bpinmaps: Force breakpoints to be inside a valid map
        dbg.bpsize: Size of software breakpoints
        dbg.btalgo: Select backtrace algorithm
       dbg.btdepth: Depth of backtrace
         dbg.clone: Stop execution if new thread is created
         dbg.execs: Stop execution if new thread is created
        dbg.follow: Follow program counter when pc > core->offset + dbg.follow
         dbg.forks: Stop execution if fork() is done (see dbg.threads)
          dbg.libs: If set stop when loading matching libname
       dbg.profile: Path to RRunProfile file
 dbg.shallow_trace: While tracing, avoid following calls outside specified range
          dbg.slow: Show stack and regs in visual mode in a slow but verbose mode
        dbg.status: Set cmd.prompt to '.dr*' or '.dr*;drd;sr PC;pi 1;s-'
        dbg.swstep: Force use of software steps (code analysis+breakpoint)
       dbg.threads: Stop all threads when debugger breaks (see dbg.forks)
         dbg.trace: Trace program execution (see asm.trace)
     dbg.trace.tag: Trace tag
        dbg.unlibs: If set stop when unloading matching libname
[0x00000000]>


#3 楼

Radare2具有与dbg.follow.child等效的配置变量set follow-fork-mod

 e??~fork
    dbg.follow.child: Continue tracing the child process on fork. By default the parent process is traced


使用命令

e dbg.follow.child = true

,或用-e发射雷达时:

r2 -e dbg.follow.child=true -d ./my_binary