W tym poście chciałbym opisać rozwiązania zadania Bit-O-Asm-3 z działu Reverse Engeering picoCTF.
Podobnie jak poprzednio, do zadania został dołączony program 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-0xc],0x9fe1a
- <+22>: mov DWORD PTR [rbp-0x8],0x4
- <+29>: mov eax,DWORD PTR [rbp-0xc]
- <+32>: imul eax,DWORD PTR [rbp-0x8]
- <+36>: add eax,0x1f5
- <+41>: mov DWORD PTR [rbp-0x4],eax
- <+44>: mov eax,DWORD PTR [rbp-0x4]
- <+47>: pop rbp
- <+48>: ret
I dokłanie jak poprzenio należy znaleść wartość zapisaną w rejestrze eax.
W programie są zdefiniowane deklaracje dwóch wartości, w miejscu [rbp-0xc] wprowadzona wartość 0x9FE1A oraz 0x4 po adresem [rpb-0x8]. Następnie w linii +29 ładowana jest wartość z adresu [rbp-0xc] do rejestru eax. Koleja linia (imul) wykonuje mnożenie wartości [rbp-0x8] (0x4) przez wartość zapisaną w rejestrze eax (0x9FE1A). Linia +36 do wyniku operacji mnożenia dodaje wartość 0x1F5.
Dalej w linii 41 następuje zapis danych z rejestru eax do [rbp-0x4].
Podsumowując, rejestr eax przechowyje wynik następującej operacji:
- (0x9fe1a * 0x4) + 0x1f5 => (654874 * 4) + 501 = 2619997 (DEC)
Wynik należy wkleić w formacie flagi czyli picoCTF{<wartość eax>}.