
약 일주일 동안 리버싱 기초 공부를 진행했다.
처음에는 어셈블리어가 거의 이해되지 않는 수준이었지만, 반복해서 보다 보니 지금은 완전히 해석할 수는 없어도 흐름 정도는 어느 정도 보이기 시작했다.
레지스터나 mov, cmp 같은 아주 기초적인 내용들은 따로 기록하지 않았다.
지금 단계에서는 개념을 외우는 것보다 전체 흐름을 이해하는 것이 더 중요하다고 판단했기 때문이다. 그래서 오늘을 기준으로 CTF에 들어가기 직전 단계부터 블로그에 기록을 남기기로 했다.
현재까지 이해한 흐름
지금까지 공부하면서 느낀 리버싱 문제의 기본 구조는 거의 비슷했다.
input → 처리(helper) → 조건 → key 비교
이 구조를 기준으로 보면 코드가 훨씬 덜 복잡하게 느껴진다. 대부분의 경우 입력값을 한 글자씩 처리하면서, 특정 연산을 거친 뒤 조건을 통과하는지 확인하고, 마지막으로 key와 비교하는 방식으로 진행된다.
오늘 가장 헷갈렸던 개념
오늘 공부하면서 가장 헷갈렸던 부분은 필터(filter)와 helper 개념이었다.
필터는 조건 검사에 해당하고, helper는 연산 과정에 해당한다.
문제는 이 두 개가 섞여서 등장할 때였다.
특히 조건이 input 자체가 아니라 helper를 거친 결과에 적용되는 경우가 있어서 흐름을 잘못 이해하면 전체 구조가 꼬이게 된다. 이 부분에서 시간을 꽤 많이 썼다.
helper 개념 정리
helper는 단순한 하나의 연산이 아니라 여러 연산이 묶인 하나의 처리 과정이라고 보는 것이 더 맞는 것 같다.
예를 들어 input에 + 연산을 하고, 그 결과에 XOR을 적용하는 경우가 있다. 이걸 한 번에 보려고 하면 헷갈리기 때문에 중간 과정을 나눠서 보는 방식이 더 이해하기 쉬웠다.
처음에는 각각의 연산을 분리해서 보고, 나중에 하나의 식으로 합치는 방식으로 접근하는 것이 현재 단계에서는 가장 현실적인 방법이라고 느꼈다.
역산 개념
리버싱에서는 결국 정답을 찾아야 하기 때문에 helper를 이해한 뒤에는 역산이 필요하다.
연산을 반대로 되돌리는 방식인데, 규칙 자체는 단순하다.
더한 것은 빼고, 뺀 것은 더하고, XOR 연산은 그대로 유지한다.
아직 완전히 익숙하지는 않지만 반복하다 보면 자연스럽게 익혀질 것 같다.
아직 부족한 부분
아직 명확하게 이해되지 않은 부분들도 있다.
점프 조건(jg, jnc 등)은 완전히 정리되지 않았고, helper가 여러 개 연결되는 경우 해석 속도가 느리다. 또한 중간에 조건이 들어가면 흐름이 끊기는 느낌이 있다.
그래도 처음 시작했을 때와 비교하면 “아예 모르겠다”는 상태는 벗어난 것 같다.
현재 상태
지금 상태를 정리하면 다음과 같다.
구조는 이해한 상태이고, 흐름은 어느 정도 보이지만 완전한 해석은 아직 어렵다.
즉, 초급 단계는 어느 정도 벗어났고 CTF에 들어가기 직전 단계라고 보는 것이 맞는 것 같다.
느낀 점
처음에는 단순히 어려운 공부라고만 느껴졌는데, 오늘은 처음으로 재미를 느꼈다.
특히 helper 개념이 어느 정도 정리되면서 코드가 단순한 연산 구조로 보이기 시작했다. 아직 부족한 부분이 많지만 방향은 맞게 가고 있다는 느낌이 든다.
이 상태로 CTF 문제를 하나씩 풀어보면서 익숙해지는 과정이 필요할 것 같다.