经典例题一(angrybird)中的一个地方有点不明白,初始化部分的代码:

state.mem[state.regs.rbp - 0x74].uint32_t = 0x40
state.mem[state.regs.rbp - 0x70].uint64_t = 0x1000
state.mem[state.regs.rbp - 0x68].uint64_t = 0x1008
state.mem[state.regs.rbp - 0x60].uint64_t = 0x1010
state.mem[state.regs.rbp - 0x58].uint64_t = 0x1018

这里,它的题解给的注释是:

Setting them to pointers to symbolic memory works fine.

这个符号内存就是 angr 模拟的内存空间吧,以 mov [rbp+var_70], offset off_606018 为例,根据它的代码,那个基准位置应该是 0x605018。为什么是这样呢?百思不得其解。。

于是我尝试了下修改它的值,结果发现修改成这样:

state.mem[state.regs.rbp - 0x74].uint32_t = 21
state.mem[state.regs.rbp - 0x70].uint64_t = 0x000
state.mem[state.regs.rbp - 0x68].uint64_t = 0x008
state.mem[state.regs.rbp - 0x60].uint64_t = 0x010
state.mem[state.regs.rbp - 0x58].uint64_t = 0x018

也可以输出,我又尝试了一下这样:

state.mem[state.regs.rbp - 0x70].uint64_t = 0x2000
state.mem[state.regs.rbp - 0x68].uint64_t = 0x2008
state.mem[state.regs.rbp - 0x60].uint64_t = 0x2010
state.mem[state.regs.rbp - 0x58].uint64_t = 0x2018

甚至是这样:

state.mem[state.regs.rbp - 0x70].long = 0x000
state.mem[state.regs.rbp - 0x68].long = 0x018
state.mem[state.regs.rbp - 0x60].long = 0x028
state.mem[state.regs.rbp - 0x58].long = 0x038

都是可以输出正确的 flag 的。。它们的输出(各种 Warning)也是大同小异。因此我怀疑根本不是注释说的原因,很可能只需要初始化就好了,说不定传一个符号向量进去也可以。。不知道作者怎么想的呀?能请教一下嘛?