已知rsp是整数A在内存中的位置,rsp + 4是整数B在内存中的位置。0x401649是程序爆炸的内存位置。需要猜测整数A和整数B的值,使得程序不会爆炸。 其余内存数据如下图所示: 内存地址 数据 4026E0 0x0000000A 4026E4 0x00000002 4026E8 0x0000000E 4026EC 0x00000007 4026F0 0x00000008 4026F4 0x0000000C 4026F8 0x0000000F 4026FC 0x0000000B 402700 0x00000000 402704 0x00000004 402708 0x00000001 40270C 0x0000000D 402710 0x00000003 402714 0x00000009 402718 0x00000006 40271C 0x00000005 阅读下面代码,回答以下问题: (1)整数A和整数B分别为多少,才能使炸弹不爆炸?401154: 8b 04 24 mov (%rsp),%eax 401157: 83 e0 0f and $0xf,%eax 40115a: 89 04 24 mov %eax,(%rsp) 40115d: 83 f8 0f cmp $0xf,%eax 401160: 74 2f je 401191 <phase_5+0x6d> 401162: b9 00 00 00 00 mov $0x0,%ecx 401167: ba 00 00 00 00 mov $0x0,%edx 40116c: 83 c2 01 add $0x1,%edx 401171: 8b 04 85 e0 26 40 00 mov 0x4026e0(,%rax,4),%eax 401178: 01 c1 add %eax,%ecx 40117a: 83 f8 0f cmp $0xf,%eax 40117d: 75 ed jne 40116c <phase_5+0x48> 40117f: c7 04 24 0f 00 00 00 movl $0xf,(%rsp) 401186: 83 fa 0f cmp $0xf,%edx 401189: 75 06 jne 401191 <phase_5+0x6d> 40118b: 3b 4c 24 04 cmp 0x4(%rsp),%ecx 40118f: 74 05 je 401196 <phase_5+0x72> 401191: e8 b3 04 00 00 callq 401649 <explode_bomb> 401196: 48 8b 44 24 08 mov 0x8(%rsp),%rax 40119b: 64 48 33 04 25 28 00 xor %fs:0x28,%rax 4011a2: 00 00 4011a4: 74 05 je 4011ab <phase_5+0x87> 4011a6: e8 55 f9 ff ff callq 400b00 <__stack_chk_fail@plt> 4011ab: 48 83 c4 18 add $0x18,%rsp 4011af: c3 retq
时间: 2024-02-10 11:30:33 浏览: 122
根据代码可知,程序要求A的值为0到15之间的整数,且A和B的和等于一个固定的值。由于程序要求A和B的和等于固定值,这个固定值可以算出来。固定值为0x0c,即12。因此,可以列出方程A + B = 0x0c。又因为A的值为0到15之间的整数,所以B的值也是0到15之间的整数。根据内存中的数据,可以知道0x4026f4和0x402710分别是整数A和整数B的值。因此,整数A的值为9,整数B的值为3,程序不会爆炸。
相关问题
反汇编中0000000000000548 <_init>: 548: 48 83 ec 08 sub $0x8,%rsp 54c: 48 8b 05 95 0a 20 00 mov 0x200a95(%rip),%rax # 200fe8 <__gmon_start__> 553: 48 85 c0 test %rax,%rax 556: 74 02 je 55a <_init+0x12> 558: ff d0 callq *%rax 55a: 48 83 c4 08 add $0x8,%rsp 55e: c3 retq
这是Intel x86-64机器码的反汇编结果,表示一个函数的汇编代码。下面是每行代码的解释:
- `sub $0x8,%rsp`:将栈指针向下移动8个字节,为函数调用做准备。
- `mov 0x200a95(%rip),%rax`:从内存地址`0x200a95`中取出8个字节,存储到寄存器`%rax`中。这里使用了相对寻址,`%rip`寄存器存储了当前指令的地址。
- `test %rax,%rax`:将寄存器`%rax`的值与自身进行按位与操作,并更新标志寄存器的值。
- `je 55a <_init+0x12>`:如果标志寄存器的零标志位为1,则跳转到`_init+0x12`处执行,否则继续执行下一条指令。
- `callq *%rax`:将寄存器`%rax`中存储的地址作为函数调用的目标地址,执行该函数。
- `add $0x8,%rsp`:将栈指针向上移动8个字节,恢复栈的状态。
- `retq`:函数返回。
这段代码实现了一个函数的初始化过程,其中包括从内存中读取一些数据,并调用某个函数进行处理。
反汇编中test001: file format elf64-x86-64 Disassembly of section .init: 0000000000000548 <_init>: 548: 48 83 ec 08 sub $0x8,%rsp 54c: 48 8b 05 95 0a 20 00 mov 0x200a95(%rip),%rax # 200fe8 <__gmon_start__> 553: 48 85 c0 test %rax,%rax 556: 74 02 je 55a <_init+0x12> 558: ff d0 callq *%rax 55a: 48 83 c4 08 add $0x8,%rsp 55e: c3 retq
这段反汇编代码是针对一个 ELF64-x86-64 格式的文件中的 .init 段的。在 _init 标签处开始,首先执行 sub $0x8,%rsp 指令,将栈指针向下移动 8 个字节。然后执行 mov 指令,将 rip 寄存器中的地址加上一个偏移量 0x200a95,得到一个地址,将该地址对应的值存储到了 rax 寄存器中。接着执行 test 指令,测试 rax 寄存器中的值是否为 0,如果为 0,跳转到 _init+0x12 标签处。如果不为 0,则执行 callq 指令,将 rax 寄存器中的值作为函数地址进行调用。最后执行 add 指令,将栈指针向上移动 8 个字节,然后执行 retq 指令,返回到调用该函数的位置。
阅读全文
相关推荐
















