Radare让我查看了函数的汇编和伪C代码。我可以在流程之外运行这些说明吗?也许自己设置寄存器?

如果是这样,我将如何去做?

我是新来的我在想,必须有某种易于设置的入口点,函数使用的寄存器,运行代码直到出现ret,然后看看发生了什么?

评论

您可以尝试使用文件的头来使其成为动态库,将其加载到程序中,然后使用函数指针调用该函数。

#1 楼

我认为您正在寻找ESIL,它允许您模拟代码

具体来说,aei用于初始化VM,aeip用于将计算机设置为curseek。您可以使用aer列出寄存器,并使用aer eax=1进行设置

您可以在此处和此处找到更多信息

[0x00000000]> ae?
|Usage: ae[idesr?] [arg]ESIL code emulation
| ae [expr]                  evaluate ESIL expression
| ae?                        show this help
| ae??                       show ESIL help
| ae[aA][f] [count]          analyse esil accesses (regs, mem..)
| aec[?]                     continue until ^C
| aecs [sn]                  continue until syscall number
| aecu [addr]                continue until address
| aecue [esil]               continue until esil expression match
| aef [addr]                 emulate function
| aei                        initialize ESIL VM state (aei- to deinitialize)
| aeim [addr] [size] [name]  initialize ESIL VM stack (aeim- remove)
| aeip                       initialize ESIL program counter to curseek
| aek [query]                perform sdb query on ESIL.info
| aek-                       resets the ESIL.info sdb instance
| aep[?] [addr]              manage esil pin hooks
| aepc [addr]                change esil PC to this address
| aer [..]                   handle ESIL registers like 'ar' or 'dr' does
| aets[?]                    ESIL Trace session
| aes                        perform emulated debugger step
| aesp [X] [N]               evaluate N instr from offset X
| aesb                       step back
| aeso                       step over
| aesu [addr]                step until given address
| aesue [esil]               step until esil expression match
| aetr[esil]                 Convert an ESIL Expression to REIL
| aex [hex]                  evaluate opcode expression


#2 楼

如您正确提到的,这是一个伪C代码,可输出类似C的代码。该代码不是有效的C代码,因此无法编译。可以使用pdc命令显示此输出。

radare2包含反编译器(如Snowman和retdec)的插件。您可以在此处阅读有关此内容和我的答案的更多信息。使用这些反编译器,您很有可能成功编译生成的代码。通常,与原始源代码相比,不建议依靠反编译来达到1:1的结果。反编译非常复杂,失败和丢失某些信息的可能性很高。

关于更改寄存器-尽管这不是“过程之外”,但您可以通过使用dr命令。

例如,要将EAX更改为0x20,您只需执行以下命令即可:

dr eax=0x20


如果您一般询问是否您可以自己更改寄存器,答案是肯定的。只需将ASM代码插入您的C程序即可:

__asm {
  mov eax, 5
  add eax, 3
}


评论


好吧,我想知道的是,是否存在像热键这样的功能,它使我能够编辑寄存器,然后将rip设置为该函数并运行它直到返回。还是类似的某种功能?这必须经常出现,而我是新来的,以这种方式谋生的人们如何在可执行文件或共享对象中执行单个功能?

–埃文·卡洛尔(Evan Carroll)
18年1月25日在22:29

使用动态仪器(如英特尔的针等)或使用仿真器(如独角兽等)

– blabb
18年1月26日在7:58

#3 楼

其他一些方法可能是:


使用IDA的AppCall功能。它并不是一个众所周知的功能(应该是!),但是IDA努力让您隔离使用二进制文件中的函数。请查看链接以获取用法详细信息。
使用调试器。这可能不是您要的内容,但是您可以轻松地提供寄存器值并执行功能,直到使用任何调试器执行ret指令为止。
使用那里的许多动态工具和仿真器之一,您可以模拟执行给定功能和状态(即寄存器等)的含义。 Angr就是这样一种工具。