程序在使用GDB修改后不会运行

时间:2017-02-08 16:21:57

标签: linux debugging assembly gdb

我只有.out文件,我正在尝试用GDB更改整数。

(gdb) disas/r main
Dump of assembler code for function main:

0x080484da <+0>:    8d 4c 24 04 lea    0x4(%esp),%ecx
0x080484de <+4>:    83 e4 f0    and    $0xfffffff0,%esp
0x080484e1 <+7>:    ff 71 fc    pushl  -0x4(%ecx)
0x080484e4 <+10>:   55  push   %ebp
0x080484e5 <+11>:   89 e5   mov    %esp,%ebp
0x080484e7 <+13>:   51  push   %ecx
0x080484e8 <+14>:   83 ec 14    sub    $0x14,%esp
0x080484eb <+17>:   c7 45 f0 00 00 00 00    movl   $0x0,-0x10(%ebp)
0x080484f2 <+24>:   c7 45 f4 00 00 00 00    movl   $0x0,-0xc(%ebp)
0x080484f9 <+31>:   83 ec 0c    sub    $0xc,%esp
0x080484fc <+34>:   6a 00   push   $0x0
0x080484fe <+36>:   e8 6d fe ff ff  call   0x8048370 <time@plt>
0x08048503 <+41>:   83 c4 10    add    $0x10,%esp
0x08048506 <+44>:   83 ec 0c    sub    $0xc,%esp
0x08048509 <+47>:   50  push   %eax
0x0804850a <+48>:   e8 81 fe ff ff  call   0x8048390 <srand@plt>
0x0804850f <+53>:   83 c4 10    add    $0x10,%esp
0x08048512 <+56>:   e8 99 fe ff ff  call   0x80483b0 <rand@plt>
0x08048517 <+61>:   89 c1   mov    %eax,%ecx
0x08048519 <+63>:   ba 67 66 66 66  mov    $0x66666667,%edx
0x0804851e <+68>:   89 c8   mov    %ecx,%eax
0x08048520 <+70>:   f7 ea   imul   %edx
0x08048522 <+72>:   c1 fa 02    sar    $0x2,%edx
0x08048525 <+75>:   89 c8   mov    %ecx,%eax
0x08048527 <+77>:   c1 f8 1f    sar    $0x1f,%eax
0x0804852a <+80>:   29 c2   sub    %eax,%edx
0x0804852c <+82>:   89 d0   mov    %edx,%eax
0x0804852e <+84>:   89 45 f4    mov    %eax,-0xc(%ebp)
0x08048531 <+87>:   8b 55 f4    mov    -0xc(%ebp),%edx
0x08048534 <+90>:   89 d0   mov    %edx,%eax
0x08048536 <+92>:   c1 e0 02    shl    $0x2,%eax
0x08048539 <+95>:   01 d0   add    %edx,%eax
0x0804853b <+97>:   01 c0   add    %eax,%eax
0x0804853d <+99>:   29 c1   sub    %eax,%ecx
0x0804853f <+101>:  89 c8   mov    %ecx,%eax
0x08048541 <+103>:  89 45 f4    mov    %eax,-0xc(%ebp)
0x08048544 <+106>:  83 ec 08    sub    $0x8,%esp
0x08048547 <+109>:  ff 75 f4    pushl  -0xc(%ebp)
0x0804854a <+112>:  68 50 86 04 08  push   $0x8048650
0x0804854f <+117>:  e8 0c fe ff ff  call   0x8048360 <printf@plt>
0x08048554 <+122>:  83 c4 10    add    $0x10,%esp
0x08048557 <+125>:  83 7d f4 05 cmpl   $0x5,-0xc(%ebp) 
0x0804855b <+129>:  7e 2a   jle    0x8048587 <main+173>
==>  0x0804855d <+131>: c7 45 f0 00 04 00 00    movl   $0x400,-0x10(%ebp)
0x08048564 <+138>:  83 ec 0c    sub    $0xc,%esp
0x08048567 <+141>:  ff 75 f0    pushl  -0x10(%ebp)
0x0804856a <+144>:  e8 5c ff ff ff  call   0x80484cb <dump>
0x0804856f <+149>:  83 c4 10    add    $0x10,%esp
0x08048572 <+152>:  83 ec 08    sub    $0x8,%esp
0x08048575 <+155>:  ff 75 f0    pushl  -0x10(%ebp)
0x08048578 <+158>:  68 82 86 04 08  push   $0x8048682
0x0804857d <+163>:  e8 de fd ff ff  call   0x8048360 <printf@plt>
0x08048582 <+168>:  83 c4 10    add    $0x10,%esp
0x08048585 <+171>:  eb 28   jmp    0x80485af <main+213>
0x08048587 <+173>:  c7 45 f0 8f 02 00 00    movl   $0x28f,-0x10(%ebp)
0x0804858e <+180>:  83 ec 0c    sub    $0xc,%esp
0x08048591 <+183>:  ff 75 f0    pushl  -0x10(%ebp)
0x08048594 <+186>:  e8 32 ff ff ff  call   0x80484cb <dump>
0x08048599 <+191>:  83 c4 10    add    $0x10,%esp
0x0804859c <+194>:  83 ec 08    sub    $0x8,%esp
0x0804859f <+197>:  ff 75 f0    pushl  -0x10(%ebp)
0x080485a2 <+200>:  68 82 86 04 08  push   $0x8048682
0x080485a7 <+205>:  e8 b4 fd ff ff  call   0x8048360 <printf@plt>
0x080485ac <+210>:  83 c4 10    add    $0x10,%esp
0x080485af <+213>:  83 ec 0c    sub    $0xc,%esp
0x080485b2 <+216>:  6a 05   push   $0x5
0x080485b4 <+218>:  e8 c7 fd ff ff  call   0x8048380 <sleep@plt>
0x080485b9 <+223>:  83 c4 10    add    $0x10,%esp
0x080485bc <+226>:  e9 51 ff ff ff  jmp    0x8048512 <main+56>
End of assembler dump.

我必须在行0x0804855d&lt; + 131&gt;行中用500改变400所以我做了

set *(0x0804855d+4) = 0x05

然后

(gdb) disas/r main
.....
0x0804855d <+131>: c7 45 f0 00 05 00 00   movl $0x500,-0x10(%edb)
.....

但是当我尝试运行它时,我将获得SIGILL并且执行将停止。 有什么明显的吗?或者不是。?

1 个答案:

答案 0 :(得分:2)

罗斯里奇完全正确。

而不是set *(0x0804855d+4) = 0x05,您应该set *(0x0804855d+3) = 0x500set *(char*)0x8048561 = 0x5