实验链接
说明:
本文只是作者在做USTC-System Programming in C课程的实验过程中遇到的一些坑,或者觉得新手可能会卡住浪费时间的点。只是提示性的说明,并不是参考答案,不保证正确性。希望大家自己动手,才能更深入理解实验内容
Exercise 1:
Tips:
- 下载的源代码需要先编译得到ssedb可执行文件。然后自己建一个 hello.c 文件,输入提供的那段代码,再编译得到 hello 可执行文件,把hello放到ssedb同文件夹中,之后就可以在terminal里用 ./ssedb hello 来运行debugger。
Exercise 2:
Tips:
- objdump -d hello > content.txt 下划线部分记得加,否则在终端输出不好找;
- 在content.txt中可以Ctrl+F搜"print"快速找到print()函数的入口地址;
My Comprehension:(Not sure)
我的print函数的入口地址为0x401775,该处指令的机器码为0xf30f1efa;
到达断点处运行regs命令得到的rip值为0x401776,比实际断点位置大1;
运行x/x 0x401775得到该处的机器码为0xcc0f1efa,首字节0xf3变成了0xcc;
发现rip的值比断点处大了1,0x401775处原本的0xf3变成了0xcc
这是不对的,我们把断点处的机器码改成0xcc是为了让子进程运行到此处时产生中断从而暂停,当子进程执行到0xcc指令后,会暂停运行,rip(程序计数器PC)会自增1到下一个指令地址。
此时我们需要恢复0x401775处的机器码为0xf3,然后将rip的值回退1,这样当继续执行子进程时,才能保证子进程的正确性不会因为设置断点而改变。
Exercise 3:
zydis准备工作:
- 在虚拟机上安装git
- 在我们的ssedb项目中创建deps文件夹(与 CMakeLists.txt 在同一层),进入deps文件夹运行如下命令,将开源项目zydis克隆到deps文件夹中(这一步可能有网络问题,如果失败就把已经克隆的文件删了再无限重试,大力出奇迹)
git clone --recursive 'https://github.com/zyantific/zydis.git'
- 修改 CMakeLists.txt 如下
cmake_minimum_required(VERSION 3.20)
project(ssedb C)
option(ZYDIS_BUILD_TOOLS "" OFF)
option(ZYDIS_BUILD_EXAMPLES "" OFF)
add_subdirectory("deps/zydis")
set(CMAKE_C_STANDARD 99)
add_executable(ssedb ast.c cmdFuncs.c main.c)
target_link_libraries(ssedb PRIVATE "Zydis")
Tips:
-
参考github里该项目的README——Examples——Disassembler中的示例代码,根据我们lab的需要进行修改就可以
-
注意PEEKDATA取出的long型数据中,高低位字节的顺序问题