炸弹实验室 phase_3,不知道如何找到开关块的起始地址

bomb lab phase_3, don't know how to find the starting address for switch block

我正在学这个软件安全class,但是我以前没学​​过c,学过一些计算机组织class,但是对汇编一点信心都没有。我对 objdump 生成的文件中的所有行进行了注释以帮助自己理解它,但有几件事对我来说仍然没有意义。

我从gdb得到的在最后,基于此,有人可以向我解释一下吗:

  1. 根据我现在的理解,字符串格式应该是%d %dsscanf转换的参数个数应该大于1,第一个参数应该是小于 5,所以我输入了 2 3,但是 gdb 的 disas 中的箭头显示我仍然卡在代码的第一行,我不知道我错在哪里,我就是不能继续。

  2. 哪一行告诉我切换规则?看了别人的汇编代码,pattern是这样的,比如*0x402470(,%rax,8),pattern是0x402470 + %rax*8,然后就可以把对应地址的内容打印出来,不知道去哪里找这种模式。我只能看到 *%rax,但是当我打印出来时,它只是我输入的字符串。

  3. <+28> 行中的 # 0x555555556cf5<+58> 行中的 # 0x555555556a80 是什么?我发现它们总是非常有用,因为我读了别人的post,我知道我在找什么,但我不知道它们是什么..

  4. 我学会了%rax(%rax),但是*%rax是什么?我无法想象除了直接使用值或将值用作地址之外还有其他情况。

  5. 根据我看的gdb教程,x是显示内存内容,p是打印一个值,但是value总是存放在某处内存,所以如果我使用地址,它们两个是否相同?我应该什么时候使用哪一个?

任何建议或指导将不胜感激!!!我也在参加关于 ARM 汇编的在线 class,关于我应该研究的更具体 material 的建议也将不胜感激,谢谢!!!!

That's number 2.  Keep going!
2 3

Breakpoint 1, 0x00005555555552cd in phase_3 ()
(gdb) disas
Dump of assembler code for function phase_3:
=> 0x00005555555552cd <+0>:     sub    [=11=]x18,%rsp
   0x00005555555552d1 <+4>:     mov    %fs:0x28,%rax
   0x00005555555552da <+13>:    mov    %rax,0x8(%rsp)
   0x00005555555552df <+18>:    xor    %eax,%eax
   0x00005555555552e1 <+20>:    lea    0x4(%rsp),%rcx
   0x00005555555552e6 <+25>:    mov    %rsp,%rdx
   0x00005555555552e9 <+28>:    lea    0x1a05(%rip),%rsi        # 0x555555556cf5
   0x00005555555552f0 <+35>:    callq  0x555555554f20 <__isoc99_sscanf@plt>
   0x00005555555552f5 <+40>:    cmp    [=11=]x1,%eax
   0x00005555555552f8 <+43>:    jle    0x555555555317 <phase_3+74>
   0x00005555555552fa <+45>:    cmpl   [=11=]x7,(%rsp)
   0x00005555555552fe <+49>:    ja     0x55555555539d <phase_3+208>
   0x0000555555555304 <+55>:    mov    (%rsp),%eax
   0x0000555555555307 <+58>:    lea    0x1772(%rip),%rdx        # 0x555555556a80
   0x000055555555530e <+65>:    movslq (%rdx,%rax,4),%rax
   0x0000555555555312 <+69>:    add    %rdx,%rax
   0x0000555555555315 <+72>:    jmpq   *%rax
   0x0000555555555317 <+74>:    callq  0x5555555559d3 <explode_bomb>
   0x000055555555531c <+79>:    jmp    0x5555555552fa <phase_3+45>
   0x000055555555531e <+81>:    mov    [=11=]x2ad,%eax
   0x0000555555555323 <+86>:    jmp    0x55555555532a <phase_3+93>
   0x0000555555555325 <+88>:    mov    [=11=]x0,%eax
   0x000055555555532a <+93>:    sub    [=11=]x228,%eax
   0x000055555555532f <+98>:    add    [=11=]x29e,%eax
   0x0000555555555334 <+103>:   sub    [=11=]xee,%eax
   0x0000555555555339 <+108>:   add    [=11=]xee,%eax
   0x000055555555533e <+113>:   sub    [=11=]xee,%eax
   0x0000555555555343 <+118>:   add    [=11=]xee,%eax
   0x0000555555555348 <+123>:   sub    [=11=]xee,%eax
   0x000055555555534d <+128>:   cmpl   [=11=]x5,(%rsp)
   0x0000555555555351 <+132>:   jg     0x555555555359 <phase_3+140>
   0x0000555555555353 <+134>:   cmp    %eax,0x4(%rsp)
   0x0000555555555357 <+138>:   je     0x55555555535e <phase_3+145>
   0x0000555555555359 <+140>:   callq  0x5555555559d3 <explode_bomb>
   0x000055555555535e <+145>:   mov    0x8(%rsp),%rax
   0x0000555555555363 <+150>:   xor    %fs:0x28,%rax
   0x000055555555536c <+159>:   jne    0x5555555553a9 <phase_3+220>
   0x000055555555536e <+161>:   add    [=11=]x18,%rsp
   0x0000555555555372 <+165>:   retq
   0x0000555555555373 <+166>:   mov    [=11=]x0,%eax
   0x0000555555555378 <+171>:   jmp    0x55555555532f <phase_3+98>
   0x000055555555537a <+173>:   mov    [=11=]x0,%eax
   0x000055555555537f <+178>:   jmp    0x555555555334 <phase_3+103>
   0x0000555555555381 <+180>:   mov    [=11=]x0,%eax
   0x0000555555555386 <+185>:   jmp    0x555555555339 <phase_3+108>
   0x0000555555555388 <+187>:   mov    [=11=]x0,%eax
   0x000055555555538d <+192>:   jmp    0x55555555533e <phase_3+113>
---Type <return> to continue, or q <return> to quit---q
Quit
(gdb) i r
rax            0x555555758760   93824994346848
rbx            0x0      0
rcx            0x5      5
rdx            0x555555758760   93824994346848
rsi            0x3      3
rdi            0x555555758760   93824994346848
rbp            0x0      0x0
rsp            0x7fffffffdf78   0x7fffffffdf78
r8             0x7ffff7ff7006   140737354100742
r9             0x0      0
r10            0x5      5
r11            0x246    582
r12            0x555555554fe0   93824992235488
r13            0x7fffffffe060   140737488347232
r14            0x0      0
r15            0x0      0
rip            0x5555555552cd   0x5555555552cd <phase_3>
eflags         0x206    [ PF IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0
(gdb) x/s $rdx
0x555555758760 <input_strings+160>:     "2 3"
(gdb) x/s 0x555555556cf5
0x555555556cf5: "%d %d"
(gdb) x/s $rsp
0x7fffffffdf78: "6QUUUU"
(gdb) x 0x555555556a80
0x555555556a80: 0xffffe89e
(gdb) p 0x555555556a80
 = 93824992242304
(gdb) x/8a 0x555555556a80
0x555555556a80: 0xffffe8a5ffffe89e      0xffffe8faffffe8f3
0x555555556a90: 0xffffe908ffffe901      0xffffe916ffffe90f
0x555555556aa0 <array.3415>:    0xa00000002     0x100000006
0x555555556ab0 <array.3415+16>: 0x100000000c    0x300000009
(gdb) x/s $r8
0x7ffff7ff7006: "8 16 32\no give Tina Fey more material.\n"
(gdb) x/s $r12
0x555555554fe0 <_start>:        "15I11^H12H340PTL5[=11=]520"
(gdb) x/s $r13
0x7fffffffe060: "[=11=]1"
(gdb) x/s $rip
0x5555555552cd <phase_3>:       "H340dH3[=11=]4%("
  1. 您在该位置放置了一个断点。要继续使用 stepi/nexti 或设置另一个断点。请注意,调用是对 sscanf 的调用,它使用字符串源。到那时你的输入已经从标准输入中读取,它作为参数传递给这个函数。
  2. +65 到+72 是开关,由于额外添加,它只是分成几个部分。
  3. 您的反汇编程序的友好服务。它显示了实际计算的地址,因此您不必弄清楚例如什么。 0x1a05(%rip) 会。
  4. *表示at&t语法中的间接跳转。 jmp *%rax 是 "jump to the address stored in rax"。需要区分 jmp foojmp *foo。寄存器操作数是明确的,但仍然使用符号(gas 否则会发出警告)。
  5. 并非所有值都在内存中。例如,要打印寄存器,您必须使用 p。您也可以使用 p 通过取消引用来打印内存内容,但 x 更灵活用于此目的。

如果您在 Binary Ninja 或 IDA pro 等反汇编程序中查看二进制文件,它会显示 switch 语句的地址。