하.. 기본에 충실하지 못했던 문제다.
ELF파일을 보면, 패킹이 되어있는지 확인하는게 중요한데....
사실 PEID로 검사를 해보긴했는데,
PEID는 PE파일만 검사가 가능한가보다... (몰랐다. 나는..)
나는 gdb-peda로 디버깅을 시도해보다가 UPX라는 문자열을 발견하고, UPX로 패킹되어있는 것을 알아차렸다.
리눅스 바이너리 언패킹은 어떻게 하지? 했는데, 그냥 윈도우 PE파일 언패킹하듯이 똑같이 하면된다.
언패킹을 하고, 해당 바이너리를 다시 IDA에 올리니까...
아 이렇게 함수가 많은 파일이었구나 새삼 느낀다....
늘 그렇듯이 main을 찾고,
main에서 문제이름과 같은 exalton함수를 찾을 수 있었다.
26째 라인에서 입력을 받고, exatlon함수로 진입한다.
C++은 진짜 익숙하지 않다...
여기에서도 이상하게 삽질했다.
결과를 먼저 말하자면, 내가 입력한 문자열의 어떠한 연산을 한 결과가 저 "1152~"와 같으면 풀린다.
디버깅을 해보면, v8이 내가 입력한 문자이고 거기에 16을 곱하는 것을 확인할 수 있다.
솔직히 그 외에는 디버깅을 진행하다보면,
'아 저기에 내가 입력한 문자가 들어가는구나'를 반복하다가 뭐지...? 하게 됐다.
다시 정리해보면,
처음에 main함수에서 v9=='q'이면 실행파일이 종료된다.
즉 v9에 내가 입력한 문자열이 들어간다.
exatlon(v10,v9)를 통해서 v9(내가 입력한 문자열)을 연산하여 v10에 저장하고,
v4 = std::operator==<char> (v10, "1142 ~ ", "784 ~"); 의 비교과정으로 플래그를 띄워준다.
'Rev > Write-up' 카테고리의 다른 글
RaziCTF2020 - Easy Conditions (0) | 2021.01.25 |
---|---|
HTB - Nostalgia (0) | 2021.01.22 |
HTB - Hackybird (0) | 2021.01.18 |
HTB - Bypass (0) | 2021.01.15 |
HTB - debugme.exe (0) | 2021.01.13 |