【发布时间】:2018-02-07 00:13:43
【问题描述】:
我有一个难题,我必须对函数进行逆向工程以破译正确的函数输入是什么(以便继续执行下一个函数)。在调试时,我使用以下作为我的函数输入:
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@"
...但是-104 和\230\357\377\277\003\016@ 都不是我输入到函数中的输入。
我假设-0x9 前缀是指另一个地址来获取值。我想我需要使用其他寄存器值/地址来帮助我:
(gdb) i r
eax 0x64 100
ecx 0xbfffea00 -1073747456
edx 0xbfffef40 -1073746112
ebx 0x405000 4214784
esp 0xbfffef30 0xbfffef30
ebp 0xbfffef58 0xbfffef58
esi 0xbfffefb0 -1073746000
edi 0xb7fb8000 -1208254464
eip 0x401084 0x401084 <phase_3+324>
eflags 0x206 [ PF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
任何帮助弄清楚这个值是什么将不胜感激!
【问题讨论】:
-
试试
x/b $ebp-9。 -
x/b $ebp-9给了我0xbfffef4f: 118...嗯。那么118是与 100 进行比较的值吗?我想知道这是从哪里来的:/ -
不是
\230八进制的第一个字节吗? IE。56?这是 char'8'的 ASCII 码。 (编辑:可能不是,不确定应该如何解释 \230)。118是'v'。好吧,ebp通常用于指向堆栈,所以使用x命令在一开始就打印更大的未来堆栈区域,并继续打印它(或使用 gdb 上的一些 GUI)来跟踪更改。 .. -
你觉得
v有什么意义吗?所以你建议我在调试器中不断运行x/b $ebp?希望%ebp最初是我的投入之一? -
$ebp是帧指针。在任何情况下,都不需要猜测。代码应该很清楚地告诉你输入在哪里。
标签: assembly