我有一个难题,我必须对一个函数进行反向工程以破译正确的函数输入(为了进入下一个函数)。在调试时,我使用以下作为我的函数输入:
6 d 358
现在我正在逐步调试gdb
调试器以查看输入是否正确。
在AT& T语法中运行gdb
时,我会遇到以下cmp
指令:
0x0040107b <+315>: movzbl -0x19(%ebp),%eax
0x0040107f <+319>: cmp %al,-0x9(%ebp)
0x00401082 <+322>: je 0x401089 <phase_3+329>
此cmp
指令理论上将我的一个输入(6
,d
或358
)与%al
进行比较。
我跑了:
(gdb) i r al
al 0x64 100
...发现%al
的值 100 。
因此-0x9(%ebp)
处的任何值都与 100 进行比较。但是,如何确定-0x9(%ebp)
处存储的值?
我尝试使用以下命令查看%ebp
处存储的十进制值/字符串值:
(gdb) i r ebp
ebp 0xbfffef58 0xbfffef58
(gdb) x/d 0xbfffef58
0xbfffef58: -104
(gdb) x/s 0xbfffef58
0xbfffef58: "\230\357\377\277\003\016@"
...但{i}}和-104
都不是我输入函数的输入。
我假设\230\357\377\277\003\016@
前缀指的是另一个地址来获取值。我想我需要使用其他寄存器值/地址来帮助我:
-0x9
任何有助于确定这个价值的帮助都会非常感激!
答案 0 :(得分:0)
如上所述:
https://www.cs.uaf.edu/2015/fall/cs301/lecture/09_16_stack.html
al和ah是寄存器的8位“char”大小部分。
因此,%al
指的是寄存器中的'char'
。因此,此cmp
语句正在比较2 char
。
让我们参考i r al
命令的输出:
(gdb) i r al
al 0x64 100
要确定char
的{{1}}值,我们需要获取提供的十六进制值并引用hex-to-ASCII chart。根据十六进制到ASCII图表,al
的{{1}}十六进制值对应于char 0x64
。嘿,这是我们的投入之一!
因此,我们知道我们将al
的输入与d
进行了比较。
要查找d
的值,我们需要转到-0x9(%ebp)
的内存地址,从该地址'值中减去-0x9(%ebp)
,最后取消引用那个地址。这是找到该值的命令:
%ebp
这给出了0x9
(十进制)的输出,它是十六进制的(gdb) x/b $ebp-9
。再次参考hex-to-ASCII图表,发现118
对应于char 0x76
。
总结:我们[{1}}的[错误]输入与0x76
的[正确]输入进行了比较。
解决方案:我们对v
的输入应更改为d
。