Понимание того, как переводится некоторый ассемблерный код - PullRequest
0 голосов
/ 29 сентября 2018

Привет, я сейчас делаю бинарную бомбу и мне интересно, правильно ли я понимаю некоторые вещи.У меня есть это;

   0x00000000004011d4 <+0>:     sub    $0x8,%rsp
   0x00000000004011d8 <+4>:     cmpb   $0x59,(%rdi)
   0x00000000004011db <+7>:     jne    0x4011fd <phase_1+41>
   0x00000000004011dd <+9>:     cmpb   $0x46,0x2(%rdi)
   0x00000000004011e1 <+13>:    jne    0x4011fd <phase_1+41>
   0x00000000004011e3 <+15>:    cmpb   $0x68,0x1(%rdi)
   0x00000000004011e7 <+19>:    je     0x40120b <phase_1+55>
   0x00000000004011e9 <+21>:    movsbl 0x10(%rdi),%ecx
   0x00000000004011ed <+25>:    movsbl 0x5(%rdi),%edx
   0x00000000004011f1 <+29>:    add    $0xb,%edx
   0x00000000004011f4 <+32>:    mov    $0x1,%eax
   0x00000000004011f9 <+37>:    cmp    %edx,%ecx
   0x00000000004011fb <+39>:    je     0x401210 <phase_1+60>
   0x00000000004011fd <+41>:    callq  0x401b20 <bomb_activation>
   0x0000000000401202 <+46>:    mov    $0xffffffffffffffff,%rax
   0x0000000000401209 <+53>:    jmp    0x401210 <phase_1+60>
   0x000000000040120b <+55>:    mov    $0x0,%eax
   0x0000000000401210 <+60>:    add    $0x8,%rsp
   0x0000000000401214 <+64>:    retq

и до сих пор я перевел это на это;

if(arr[0] != 'Y'){
bomb_activation();
}
if(arr[2] != 'F'){
bomb_activation();
}
if(arr[1] == 'h'){
bomb_activation();
}

int a = arr[10];
int b = arr[5];
b += 11;
status = 1;

if(t1 != t2){
bomb_activation();
}
return status;
}

Как вы, вероятно, можете сказать, я действительно запутался в том, как именно читать эти строки,Я вижу это как перемещение 10-го элемента массива в реестр ecx и заполнение остальной части реестра нулями и той же логикой для edx, однако я не слишком уверен, как определить значение arr [5] илиarr [10] как раз из этого.

   0x00000000004011e9 <+21>:    movsbl 0x10(%rdi),%ecx
   0x00000000004011ed <+25>:    movsbl 0x5(%rdi),%edx
   0x00000000004011f1 <+29>:    add    $0xb,%edx
   0x00000000004011f4 <+32>:    mov    $0x1,%eax
   0x00000000004011f9 <+37>:    cmp    %edx,%ecx

и, более конкретно, как я должен определить размер массива, может быть, я его вообще не понимаю, хотя любая помощь будет большой благодарностью.

...