【深入理解计算机系统csapp lab】bomblab

本文详细介绍了bomblab的六关攻略,每关关键点包括:第一关理解gdb和函数参数;第二关分析read_six_numbers及sscanf函数;第三关解析动态跳转地址;第四关理解func4函数;第五关查找字符串匹配规律;第六关理解链表操作。通过反汇编和调试,找到各关输入密码。
摘要由CSDN通过智能技术生成

bomblab一共有六关,每一关都需要输入正确的密码

首先打开bomb.c文件,看到main函数主要有6个phase,每一关大概都是这样的:

input = read_line();             /* Get input                   */
phase_1(input);                  /* Run the phase               */
phase_defused();                 /* Drat!  They figured it out!
			      * Let me know how they did it. */
printf("Phase 1 defused. How about the next one?\n");

也就是需要给一个输入,如果输入符合某些要求,就能够通过。那么我们怎么样找到通关的密码呢?那就需要我们反汇编bomb,从汇编代码中探索啦。

第一关:
重点:gdb的基本操作与函数传参

gdb bomb进入gdb,在phase_1函数的入口打上断点,然后运行程序。需要输入一个密码,我们就先随便输入一个。
到达phase_1断点后,用disas命令进行反汇编,就能看到phase_1函数的汇编代码啦。
在这里插入图片描述

分析这段汇编代码,首先,sub $0x8,%rsp 显然是分配了phase_1的栈帧(stack frame),大小为8个字节。
接着在call指令转移到函数<strings_not_equal>之前设置了寄存器%rsi。回忆一下函数的参数传递,前6个参数由寄存器%rdi,%rsi,%rdx,%rcx,%r8,%r9,超出6个的参数通过栈来传递。%rsi对应着第2个参数,是一个立即数,那么第一个参数%rdi中的内容是什么呢?
因为在phase_1中,我们没有改变%rdi,那么此时%rdi仍旧是调用phase_1的函数(main函数)传给phase_1的第一个参数。我们看一下bomb.c,可以发现这个参数是我们的输入。

input = read_line();             /* Get input                   */
phase_1(input);                  /* Run the phase               */
phase_defused();                 /* Drat!  They figured it out!

分析到这里,我们可以知道phase_1调用了<strings_not_equal>,并把input作为第一个参数,0x401338 作为第二个参数传给了<strings_not_equal>。
stepi 3,继续运行3步,能够进入<strings_not_equal>,disas反汇编。同理,分析可知这个函数的功能是判断两个字符串是否相同,相同则返回1。
在这里插入图片描述

之后回到<phase_1>,还有这么几行

test   %eax,%eax
je     0x400ef7 <phase_1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值