跳转至

实验说明和简要笔记

难度由浅及深 每个人的bomb是不一样的 gcc -E test1.c -o test1.i 预处理 gcc -S test1.i -o test1.s 汇编 gcc -c test1.s -o test1.o 编译 gcc -o test test1.o 生成可执行文件 readelf -h输出elf文件的信息 可执行的文件一般都是elf文件

程序一般长这样 .data .bss ....

MakeFile规则 test:test1.o gcc -o test test1.o test1.o:test1.s gcc -c test1.s -o test1.o

gcc -g -o test test.o debug形式生成可执行程序 gcc -o test test.o 以release形式生乘可执行文件 以release形式生成可执行程序还是以debug形式生成可执行程序 gdb test (gdb) start layout src ctrl x 2 进入汇编窗口 tui reg float查看寄存器 tui reg general layout src和layout asm切换模式

starti跳到汇编的第一条指令 record full记住所有走过的路 n向下走 什么都不按则跳转到上一条指令 print i 打印i的值 watch i一直监控i 在vim里面直接编译 :!gcc -g -o test test2.c

bt回写整个调用栈 到print的地方是时按s直接跳转到函数 up就又回来了 down反之 发生一个函数调用就会形成一个新的栈 在没有分配内存的指针上赋值是错误的 int *p=NULL; *p=23;错误 生成core文件??? 显示触发错误的那一行 coredown?核心转储??? 崩溃测试 设置断点

objdump -DS test --visualize-jumps >test.asm 能看到跳转线 更好地了解汇编的过程


现在我在记录完成bomb lab中的实际情况 11.6晚上之前要提交作业 但是我今天 10.18-19凌晨就要完成它。 我的题号 70 最后提交文件时,是这样的,就是在自己的对应目录下面创建一个名为anwser.txt的文件 将答案写在那里面,每道题目一行,每个输入中间一定有空格分割 给大家每个人都建立了 job3_xx 大家感觉自己当初选的编号看对应的job 绿色就好了, 建议大家本地测试没有问题之后,再往代码仓库推代码。 推到自己的仓库之后,open pull request,发起到我的仓库,会检查你们的代码。

objdump -d bomb > bomb.txt

gdb bomb

gdb run 可缩写为 gdb r gdb run权限不够,无法运行 chmod 777 bomb chmod 777 bomb.c

gdb进去之后 (gdb)split layout 分割 gdb布局 phase1 在bomb.c中代码在第74行 设置断点(gdb)break 74 b 74也行 然后r运行,随便输入一个字符 到达断点 再si逐条指令步进 进入到 phase_1() 函数内♂部,这里和(gdb)s是有区别的,si是一条指令一条指令地调试,而 s 是一行一行代码地调试,所以这里如果使用(gdb)s应该会出错。 x可以直接打印值 x $rsi 打印寄存器rsi的值 x 的意思是检查 ,看一下某个地址中存的值是什么

gdb设置断点出现Cannot access memory at address的错误

x/s命令和x命令辨析 starti跳到最开始

这位同学基本完成了 bomb lab,但是有两点需要强调: (1) 同学们点进去签一下 CLA,如果你参与一个开源的项目,都会有 CLA 需要你确认;(2) 提交作业的时候,必须保证你的 job_xxx 是绿色的。

我的phase5草图(真是草的不能再草了哈哈):

phase5草图

晚上看到的一个phase5讲解

BinaryBombP5K2