文档介绍:修改栈中函数调用返回地址,改变程序执行流程
任务:修改栈中函数调用返回地址,改变程序执行流程
在本例中,通过修改函数function调用返回地址,使程序跳过执行x=1的赋值语句,从而使输出结果为0
为了实现这个目标,需要
0x5(%eax),%edx
0x08048436 <+34>: mov -0x1c(%ebp),%eax
0x08048439 <+37>: mov %edx,(%eax)
0x0804843b <+39>: mov -0xc(%ebp),%eax
0x0804843e <+42>: xor %gs:0x14,%eax
0x08048445 <+49>: je 0x804844c <function+56>
0x08048447 <+51>: call 0x8048348<__stack_chk_******@plt>
0x0804844c <+56>: leave
0x0804844d <+57>: ret
下面通过设置断点和单步调试的方法找到所需地址
在x=0处设置断点 break 14
运行 run
寄存器情况:
(gdb) info registers
eax 0xbffff3e4 -1073744924
ecx 0x133a3a60 322583136
edx 0x1 1
ebx 0x287ff4 2654196
esp 0xbffff310 0xbffff310
ebp 0xbffff338 0xbffff338
esi 0x0 0
edi 0x0 0
eip 0x8048457 0x8048457 <main+9>
eflags 0x282 [ SF IF ]
cs 0x73 115
ss 0x7b 123
ebp
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
栈的情况:
0xbffff310: 0x00288324 0x00287ff4 0x080484b0 0xbffff338
0xbffff320: 0x0015e985 0x0011eb80 0x080484bb 0x00287ff4
0xbffff330: 0x080484b0 0x00000000
下一条指令 (gdb) display/i $pc
=> 0x8048457 <main+9>: movl $0x0,0x1c(%esp)
继续执行
(gdb) si
15 function(1,2,3);
1: x/i $pc
=> 0x804845f <main+17>: movl $0x3,0x8(%esp)
看寄存器
(gdb) info registers
eax 0xbffff3e4 -1073744924
ecx 0x133a3a60 322583136
edx 0x1 1
ebx 0x287ff4 2654196
esp 0xbffff310 0xbffff310
ebp 0xbffff338 0xbffff338
esi 0x0 0
edi 0x0 0
eip 0x804845f 0x804845f <main+17>
eflags 0x282 [ SF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
栈
(gdb) x/10x $esp
0xbffff310: 0x00288324 0x00287ff4 0x080484b0 0xbffff338
0xbffff320: 0x0015e985 0x0011eb80