W tym poście chciałbym opisać rozwiązania zadania Bit-O-Asm-2 z działu Reverse Engeering picoCTF.
Do zadania został dołączony kod programu w assemblerze:
- <+0>: endbr64
- <+4>: push rbp
- <+5>: mov rbp,rsp
- <+8>: mov DWORD PTR [rbp-0x14],edi
- <+11>: mov QWORD PTR [rbp-0x20],rsi
- <+15>: mov DWORD PTR [rbp-0x4],0x9fe1a
- <+22>: mov eax,DWORD PTR [rbp-0x4]
- <+25>: pop rbp
- <+26>: ret
Przejdę teraz po poszczególnych liniach. W zadaniu poprzednim wartość w rejestrze eax była widoczna odrazu bez konieczności głębszej analizy kodu programu. Tutaj jest to delikatnie bardziej utrudnione.
Program powyżej nie wykonuje wielu operacji. Jedynie kilka na rejestrach oraz na stosie.
Do odczytu wartości, należy przyjrzeć się programowi od linii 15. Zapisywana jest wartość 0x9FE1A do pamięci pod adresem [rbp-0x4]. W kolejnej instrukcji ładowana jest wartość z adresu [rbp-0x4] do rejestru eax. Następnie przywraca wartość rejestru rbp, po czym następuje zakończenie wykonywania funkcji.
Oznacza to, że szukaną flagą jest wartość 0x9FE1A przetworzona z zapisu szesnastkowego na dziesiętny. Należy jeszcze tą wartość wstawić w picoCTF{ }.