汇编/gdb:添加行为

问题描述 投票:0回答:1

在使用 GDB 运行 ELF 程序时,我目前目睹了特定添加指令的相当意外的行为:

英特尔语法:

add    cl,BYTE PTR [eax]

AT&T 语法:

add    (%eax),%cl

我希望这条指令与 gdb 的

set $cl=$cl+*((char*) $eax)
具有相同的含义(无论触发的标志如何)。但对于某个调试会话,行为并不相同(见下文):(char) *$eax 的值为 0xb8,$cl 的值为 0,但 $cl 的结果值为 0xcc。

我的问题是:这个0xcc从哪里来?为什么结果不是0xb8?

为了回答下面 Jester 的评论,以下 gdb 会话按预期工作:

(gdb) b *0x08048119
Breakpoint 1 at 0x8048119
(gdb) r
Starting program: /tmp/ch20.bin
Welcome to Root-Me Challenges
Pass: foo

Breakpoint 1, 0x08048119 in ?? ()
(gdb) x/i $eip
=> 0x8048119:   add    (%eax),%cl
(gdb) x/bx $eax
0x8048080:      0xb8
(gdb) p/x $cl
$1 = 0x0
(gdb) si
0x0804811b in ?? ()
(gdb) p/x $cl
$2 = 0xb8

但我不明白为什么下面的结果没有给出相同的结果:

(gdb) b *0x8048080
Breakpoint 1 at 0x8048080
(gdb) r
Starting program: /home/baz1/Downloads/ch20.bin 

Breakpoint 1, 0x08048080 in ?? ()
(gdb) ni
0x08048085 in ?? ()
(gdb) 
0x0804808a in ?? ()
(gdb) 
0x0804808f in ?? ()
(gdb) 
0x08048094 in ?? ()
(gdb) 
Welcome to Root-Me Challenges
Pass: 0x08048096 in ?? ()
(gdb) 
0x0804809b in ?? ()
(gdb) 
0x0804809d in ?? ()
(gdb) 
0x080480a2 in ?? ()
(gdb) 
0x080480a7 in ?? ()
(gdb) 

0x080480a9 in ?? ()
(gdb) 
0x080480ab in ?? ()
(gdb) 
0x080480b0 in ?? ()
(gdb) 
0x080480b5 in ?? ()
(gdb) 
0x08048115 in ?? ()
(gdb) 
0x08048117 in ?? ()
(gdb) 
0x08048119 in ?? ()
(gdb) x/i $eip
=> 0x8048119:   add    (%eax),%cl
(gdb) x/bx $eax
0x8048080:  0xb8
(gdb) p/x $cl
$1 = 0x0
(gdb) si
0x0804811b in ?? ()
(gdb) p/x $cl
$2 = 0xcc

非常感谢您的帮助。

assembly x86 gdb addition
1个回答
2
投票

b *0x8048080
将软件断点放入内存中,该断点恰好是操作码为
int3
0xcc
指令。然后
add
指令将读取此内容而不是原始内存内容。您可以在断点命中后将其删除,或者使用不修改代码的硬件断点。

© www.soinside.com 2019 - 2024. All rights reserved.