该实验的主题是“链接”。
准备工具
虚拟机,Ubuntu32位,hexedit,main.o,phase1.o,该实验的C代码框架如下
// main.c
void (*phase)(); /*初始化为0*/
int main( int argc, const char* argv[] ) {
if ( phase )
(*phase)();
else
printf("To run lab, please link the relevant object module with the main module.\n");
return 0;
}
// phase[n].c
void do_phase() {
… // 该阶段具体工作
}
void (*phase)() = do_phase;
步骤1
命令行
gcc main.o phase1.o
./a.out
输出
实验目标:通过改phase1的.data节,使得输出是学号(假定学号是10个0)
步骤2
命令行
objdump -s -d a.out
把a.out反汇编的同时,显示源文件(这样就能看到每个节中的数据)
找到main函数,看0x8048437这一行,调用了地址为M[0x804a0d4]的函数。
找到0x804a0d4存的地址,发现是804845d(下图,高亮的地方,注意用小端序的方法来读)
再去找0804845d这个位置(从汇编代码找更清晰),如下图,发现就是do phase函数
这个函数里调用了puts来输出字符串,字符串的首地址就是第一个参数,调用前放在寄存器ax以实现传参。ax中的值为0x804a061,这就是字符串的首地址。
找到了位置 ,进入hexedit,在对应位置修改,即可
步骤3
重新链接,命令行
gcc main.o phase1.o -o test
./test
phase1完成