лаборатория бомбы phase_3, не знаю, как найти начальный адрес для блока переключателей - PullRequest
0 голосов
/ 26 января 2019

Я беру этот класс безопасности программного обеспечения, но я никогда не делал c, я взял некоторый класс организации компьютера, но не уверен в сборке вообще. Я прокомментировал все строки в файле, сгенерированном objdump, чтобы помочь себе понять это, но некоторые вещи все еще не имеют смысла для меня.

То, что я получил от gdb, в конце, на основании этого, кто-то может мне объяснить:

  1. исходя из моего понимания, формат строки должен быть %d %d, количество аргументов, преобразованных sscanf, должно быть больше 1, первый аргумент должен быть меньше 5, поэтому я набрал 2 3, но стрелка в disas от gdb показывает, что я все еще застрял в первой строке кода, я не знаю, в чем я не прав, что просто не могу продолжить.

  2. какая линия говорит мне правило для переключения? Я читаю код ассемблера других людей, шаблон, например, *0x402470(,%rax,8), шаблон 0x402470 + %rax*8, затем вы можете распечатать содержимое по соответствующему адресу, я не знаю, где найти этот шаблон. Все, что я вижу, это *%rax, но когда я его распечатываю, я просто набираю строку.

  3. что такое # 0x555555556cf5 в строке <+28> и # 0x555555556a80 в строке <+58>? Я обнаружил, что они всегда очень полезны, потому что я читаю пост других людей, я знаю, что я ищу, но я не знаю, что они ..

  4. Я выучил %rax и (%rax), но что такое *%rax? Я не могу себе представить, что дело не только в непосредственном использовании значения или использовании значения в качестве адреса.

  5. на основании того, что я прочитал из учебника gdb, x - для отображения содержимого памяти, а p - для вывода значения, но значение всегда сохраняется в каком-то месте памяти, поэтому, если я использую адрес, они два одинаковые? когда я должен использовать какой?

Любое предложение или руководство будет очень признателен !!! Я также посещаю онлайн-урок по сборке ARM, и я буду очень признателен за предложения о том, какой более конкретный материал мне следует изучить, спасибо !!!!

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    $0x18,%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    $0x1,%eax
   0x00005555555552f8 <+43>:    jle    0x555555555317 <phase_3+74>
   0x00005555555552fa <+45>:    cmpl   $0x7,(%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    $0x2ad,%eax
   0x0000555555555323 <+86>:    jmp    0x55555555532a <phase_3+93>
   0x0000555555555325 <+88>:    mov    $0x0,%eax
   0x000055555555532a <+93>:    sub    $0x228,%eax
   0x000055555555532f <+98>:    add    $0x29e,%eax
   0x0000555555555334 <+103>:   sub    $0xee,%eax
   0x0000555555555339 <+108>:   add    $0xee,%eax
   0x000055555555533e <+113>:   sub    $0xee,%eax
   0x0000555555555343 <+118>:   add    $0xee,%eax
   0x0000555555555348 <+123>:   sub    $0xee,%eax
   0x000055555555534d <+128>:   cmpl   $0x5,(%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    $0x18,%rsp
   0x0000555555555372 <+165>:   retq
   0x0000555555555373 <+166>:   mov    $0x0,%eax
   0x0000555555555378 <+171>:   jmp    0x55555555532f <phase_3+98>
   0x000055555555537a <+173>:   mov    $0x0,%eax
   0x000055555555537f <+178>:   jmp    0x555555555334 <phase_3+103>
   0x0000555555555381 <+180>:   mov    $0x0,%eax
   0x0000555555555386 <+185>:   jmp    0x555555555339 <phase_3+108>
   0x0000555555555388 <+187>:   mov    $0x0,%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: "\206QUUUU"
(gdb) x 0x555555556a80
0x555555556a80: 0xffffe89e
(gdb) p 0x555555556a80
$1 = 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>:        "1\355I\211\321^H\211\342H\203\344\360PTL\215\005\252\030"
(gdb) x/s $r13
0x7fffffffe060: "\001"
(gdb) x/s $rip
0x5555555552cd <phase_3>:       "H\203\354\030dH\213\004%("

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Если вы просматриваете двоичный файл в дизассемблере, таком как Binary Ninja или IDA pro, он покажет вам адреса операторов переключения.

0 голосов
/ 26 января 2019
  1. Вы ставите точку останова в этом месте.Для продолжения используйте stepi / nexti или установите другую точку останова.Обратите внимание, что вызов sscanf, который использует источник строки.К этому моменту ваш ввод уже был прочитан из стандартного ввода, он передается в качестве аргумента этой функции.
  2. + 65 к +72 - это переключатель, он просто разбивается на части из-за дополнительного добавления.
  3. Вежливое обслуживание вашего дизассемблера.Он показывает фактический вычисленный адрес, поэтому вам не нужно выяснять, что, например, будет 0x1a05(%rip).
  4. * означает косвенный переход в синтаксис at & t.jmp *%rax - это «перейти к адресу, сохраненному в rax».Нужно различать jmp foo и jmp *foo.Операнды регистра однозначны, но запись все еще используется (в противном случае gas выдаст предупреждение).
  5. Не все значения находятся в памяти.Например, чтобы распечатать регистр, вы должны использовать p.Вы можете использовать p для печати содержимого памяти, также используя разыменование, но x более гибок для этой цели.
...