0x080484a1
0x080484a3
0x080484a6
0x080484a9
0x080484ae
0x080484b1
0x080484b4
0x080484b9
0x080484be
0x080484c1
0x080484c2
End of assembler dump.
(gdb) s
The program is not being run.
(gdb) r
Starting program: /home/wangyao/a.out
Failed to read a valid object file image from memory.
Breakpoint 1, main () at test.c:16
16 test();
(gdb) s
test () at test.c:6
6 scanf("%d", &t);
(gdb) p &t
$1 = (int *) 0xbffff554
(gdb) p t
$2 = 134513888
(gdb) p *0xbffff554
$3 = 134513888
(gdb) s
1
11 }
(gdb) p t
$4 = 1
(gdb) p *0xbffff554
$5 = 1
(gdb) s
main () at test.c:17
17 printf("%d", m);
(gdb) p m
$6 = 134513888
(gdb) p &m
$7 = (int *) 0xbffff564
(gdb) set *0xbffff564=*0xbffff554
(gdb) p m
$8 = 1
(gdb) p *0xbffff564
$9 = 1
(gdb) q
The program is running. Exit anyway? (y or n) y
这样的话,就将输入的值赋给了m了。
这里,由于2.6.11之后的内核加入了虚拟地址变换,所以我们关掉randomize_va_space,不
关掉也是可以的,只不过每次地址总是变化,比较讨厌。
gcc-4.x版本的编译出来的代码看起来不是很清晰,使用的是gcc-3.0,不过原理是一样子的
。
【 在 fisherman (生命在于折腾) 的大作中提到: 】
: 可以使用类似于缓冲区溢出的方法,在test()中精确定位m,将输入赋给m即可。但是不同
编译器可能不一样,无法做一个通用的代码来实现。
--
每日至少抽一刻钟,解答邮件列表中初学者的问题,
每周至少抽两小时,整理新学知识将体验发表/分享出去,
通过Blog/Wiki/MaiList/个人网站……
每旬至少抽四个小时, 来翻译自个儿喜爱的自由软件的文档,
每月至少抽八小时, 快乐的编程,推进自个儿的项目,
每年至少参加一次, 自由软件的活动,传播自由软件思想,
※ 来源:·紫丁香社区 lilacbbs.com·[FROM: 221.212.*.*]