本阶段主题是链接中的“重定位”。两次重定位,一次是绝对地址重定位,一次是PC相对地址重定位。
本题目标依旧是输出学号,反汇编phase2.o,看到学号“0000000000”已经存放在只读数据区了。现在任务就是改do_pheas的指令和重定位表(.rel.test)的内容。
step1 仿照phase1的代码,先写出指令的框架
00000030 <do_phase>:30: 55 push %ebp31: 89 e5 mov %esp,%ebp33: 83 ec 08 sub $0x8,%esp36: b8 xx xx xx xx mov xxxxxxxx,%eax3b: 83 ec 0c sub $0xc,%esp3e: 50 push %eax3f: e8 xx xx xx xx call xxxxxxxx44: 83 c4 10 add $0x10,%esp47: 90 nop48: c9 leave 49: c3 ret 4a: 90 nop4b: 90 nop4c: 90 nop4d: 90 nop4e: 90 nop4f: 90 nop50: 90 nop51: 90 nop52: 90 nop53: 90 nop54: 5d pop %ebp55: c3 ret
两个都是x的地方就是接下来要改的地方。
step2 判断是绝对地址重定位还是PC相对地址重定位
有两种办法.
办法一:参考phase1链接后的可执行文件的机器代码
0804845d <do_phase>:804845d: 55 push %ebp804845e: 89 e5 mov %esp,%ebp8048460: 83 ec 08 sub $0x8,%esp8048463: b8 61 a0 04 08 mov $0x804a061,%eax8048468: 83 ec 0c sub $0xc,%esp804846b: 50 push %eax804846c: e8 7f fe ff ff call 80482f0 <puts@plt>8048471: 83 c4 10 add $0x10,%esp8048474: 90 nop8048475: c9 leave 8048476: c3 ret 8048477: 66 90 xchg %ax,%ax8048479: 66 90 xchg %ax,%ax804847b: 66 90 xchg %ax,%ax804847d: 66 90 xchg %ax,%ax804847f: 90 nop
如上,ax那里是绝对地址,call那里用的e8,就是PC相对
办法二:看phase2.o的重定位节,命令为readelf -r phase2.o
类型那一列直接写明了。
step3 改重定位表
找出框架,eax那行需要重定位的地方的字节是37,call那是40,则用hexedit编辑phase2.o,改重定位表。
00000030 <do_phase>:30: 55 push %ebp31: 89 e5 mov %esp,%ebp33: 83 ec 08 sub $0x8,%esp36: b8 xx xx xx xx mov xxxxxxxx,%eax3b: 83 ec 0c sub $0xc,%esp3e: 50 push %eax3f: e8 xx xx xx xx call xxxxxxxx44: 83 c4 10 add $0x10,%esp47: 90 nop48: c9 leave 49: c3 ret 4a: 90 nop4b: 90 nop4c: 90 nop4d: 90 nop4e: 90 nop4f: 90 nop50: 90 nop51: 90 nop52: 90 nop53: 90 nop54: 5d pop %ebp55: c3 ret
step4 代码填完整
这一步需要了解重定位的完整过程。
00000030 <do_phase>:30: 55 push %ebp31: 89 e5 mov %esp,%ebp33: 83 ec 08 sub $0x8,%esp36: b8 00 00 00 00 mov xxxxxxxx,%eax3b: 83 ec 0c sub $0xc,%esp3e: 50 push %eax3f: e8 fc ff ff ff call xxxxxxxx44: 83 c4 10 add $0x10,%esp47: 90 nop48: c9 leave 49: c3 ret 4a: 90 nop4b: 90 nop4c: 90 nop4d: 90 nop4e: 90 nop4f: 90 nop50: 90 nop51: 90 nop52: 90 nop53: 90 nop54: 5d pop %ebp55: c3 ret