작년에 (전)동아리 회장님이 리버싱 연습하라고 주셨던 엑세스 파일을 주셨던 것이 이 글의 시작이며, 자료가 별로 없어서 리버싱을 하는 과정에서 조금이라도 편안하게 공부할 수 있는 자료가 될 거 같다.
IDA에 해당 엑세스(.exe) 확장자 파일을 열어주고 IDA-VIEW가 아닌 HEX-VIEW로 16진수에서 값을 찾는게 조금 더 수월하며 Function name에서 main/ sub_number과 같은 함수를 먼저 들어가서 확인하는 것이 워게임이나 리버싱 연습할 때 괜찮은 방법중 하나라 생각이라 느낀다.
해당 식을 for 문이 끝날 때까지 만족한다면 Correct를 출력한다. 여기서 -5는 정수이므로 4바이트 문자는 1바이트이고, 4바이트와 1바이트를 계산하면 1바이트 높은 주소부분을 0으로 채우고 4바이트로 만든 다음에 계산하면된다.
다음으로 unsigned __int8으로 형변환이 되므로 앞에 3바이트를 날려버린다. 그리고 140003000에 저장된 문자와 비교한다.
위에 메모리 값인 0ACh, 0F3h, 0Ch, 25h, 0A3h, 10h, 0B7h, 25h, 16h, 0C6h, 0B7h, 0BCh, 7, 25h, 2, 0D5h, 0C6h을 모아서 Python코드로 다시 만들어보기로 한다.
buf = [0xAC, 0xF3, 0x0C, 0x25, 0xA3, 0x10, 0xB7, 0x25, 0x16, 0xC6, 0xB7, 0xBC, 0x07, 0x25, 0x02, 0xD5, 0xC6, 0x11, 0x07, 0xC5, 0x00]
result = ""
for byte in buf:
for i in range(256):
a = byte + i * 256
if a % 0xfb == 0:
result += chr(a // 0xfb)
print(result)
현재 코드에선 if ( *(_DWORD *)&aC[4 * i] != *(unsigned __int8 *)(a1 + i) ) 만 유일하게 반응한 코드이기에 더 들어가보면
data:0000000140003000 aC db 'C',0 ; DATA XREF: sub_140001000+28↑o
.data:0000000140003002 align 4
.data:0000000140003004 aO db 'o',0
.data:0000000140003006 align 8
.data:0000000140003008 aM db 'm',0
.data:000000014000300A align 4
.data:000000014000300C aP db 'p',0
.data:000000014000300E align 10h
.data:0000000140003010 a4 db '4',0
.data:0000000140003012 align 4
.data:0000000140003014 aR db 'r',0
.data:0000000140003016 align 8
.data:0000000140003018 aE db 'e',0
.data:000000014000301A align 4
.data:000000014000301C db '_',0
.data:000000014000301E align 20h
.data:0000000140003020 aT db 't',0
.data:0000000140003022 align 4
.data:0000000140003024 db 'h',0
.data:0000000140003026 align 8
.data:0000000140003028 aE_0 db 'e',0
.data:000000014000302A align 4
.data:000000014000302C db '_',0
.data:000000014000302E align 10h
.data:0000000140003030 aA db 'a',0
.data:0000000140003032 align 4
.data:0000000140003034 aR_0 db 'r',0
.data:0000000140003036 align 8
.data:0000000140003038 aR_1 db 'r',0
.data:000000014000303A align 4
.data:000000014000303C a4_0 db '4',0
.data:000000014000303E align 20h
.data:0000000140003040 aY db 'y',0
.data:0000000140003042 align 10h
세로로 익숙한 영단어와 숫자가 존재한다. 모두 종합해서 쓰자면 "Comp4re_the_arr4y"로 나온다.
리버스 엔지니어링을 독학으로 얼마나 가능할진 모르겠으나, 최대한 책과 유튜브 등을 보면서 공부를 해보겠다.
시작에 앞서 리버스 엔지니어링에 대해 잠깐 설명하자면 C, C++ 등 고급언어(high level language) 즉 사람이 알아보기 쉽게 만들어진 언어로 개발한 프로그램, 하드웨어등을 IDA, Windbg, Ghidra 등의 도구를 사용하여 분석 후 보다 더 안전하게 만드는 목적이며, 이를 악용하면 인터넷상 존재하는 벽돌판 게임, 인게임 핵등이 만들어진다.
이제 본론으로 들어가면 제목, 제목 하단 내용과 동일하게 정말 어디까지 목표가 될지 모르겠지만 해볼 수 있는 한 계속해서 진행할 스터디다.