piątek, 7 lutego 2025

picoCTF - Bit-O-Asm 4

W tym poście chciałbym opisać rozwiązanie zadania Bit-O-Asm 4 z działu Reverse Engineering picoCTF. 

Jak w poprzednich ćwiczeniach do zadania dołączony jest kod assemblera:

  1. <+0>:     endbr64
  2. <+4>:     push   rbp
  3. <+5>:     mov    rbp,rsp
  4. <+8>:     mov    DWORD PTR [rbp-0x14],edi
  5. <+11>:    mov    QWORD PTR [rbp-0x20],rsi
  6. <+15>:    mov    DWORD PTR [rbp-0x4],0x9fe1a
  7. <+22>:    cmp    DWORD PTR [rbp-0x4],0x2710
  8. <+29>:    jle    0x55555555514e <main+37>
  9. <+31>:    sub    DWORD PTR [rbp-0x4],0x65
  10. <+35>:    jmp    0x555555555152 <main+41>
  11. <+37>:    add    DWORD PTR [rbp-0x4],0x65
  12. <+41>:    mov    eax,DWORD PTR [rbp-0x4]
  13. <+44>:    pop    rbp
  14. <+45>:    ret

Przejdę od razu do linii 15, gdzie następuje przypisanie wartości 0x9FE1A do adresu w pamięci [rbp-0x4]. Następnie wykonywana jest instrukcja cmp, porównująca zawartość [rbp-0x4] z wartością 0x2710. Jeśli warunek porównania jest spełniony, następuje skok do instrukcji w linii 37. W przeciwnym razie, co w tym przypadku ma miejsce, przechodzimy do linii 31, gdzie od wartości zapisanej w [rbp-0x4] (0x9FE1A) odejmowana jest wartość 0x65. Następnie wykonywana jest instrukcja jmp, która pomija linię 37 i przekierowuje wykonanie programu bezpośrednio do linii 41, gdzie dane z adresu [rbp-0x4] zostają wprowadzone do rejestru EAX

Wobec tego odpowiedź to 0x9FE1A - 0x65 = 0x9FDB5 (654773).