문제
Unpack을 한 후 Serial을 찾으시오.
정답인증은 OEP + Serial
Ex) 00400000PASSWORD
다운로드
실행
또 나온 시리얼 맞추기 문제입니다.. 이런 유형 말고 좀 신선한 유형은 없는걸까요 이제 슬 지겹네요 ㅎㅎ..
아무거나 입력하면 당연히 틀렸다고 나옵니다. 이걸 찾아야 합니다.
또 문제에서 물어본게 시리얼 뿐만이 아니기 때문에 언패킹해서 OEP 도 확인해야 합니다.
풀이
일단 Unpack을 하라고 했으므로 패커 타입을 확인해봐야 하는데 역시나 UPX 입니다.
저번 Basic RCE L05번 풀이에서 패킹의 개념과 UPX 언패킹에 대해 자세히 설명드렸으므로 언패킹에 대해 다시 설명을 드리진 않겠습니다. 궁금하신 분들은 [링크] 를 타고 들어가서 글을 한번 읽어주세요.
또 UPX 3.03 으로 패킹된걸로 봐선 이 CrackMe가 꽤나 최근에 제작한 거 같습니다.
UPX로 언팩해줍니다. 중간에 Permission denied 가 떠서 당황했는데 06.exe를 실행시킨 상태서 언패킹을 시도해서 그렇더라구요 -.- 끄고 언패킹 하니 바로 풀렸습니다.
언패킹 후 DIE로 다시 불러오면 UPX로 패킹된 내역이 사라진 것을 볼 수 있습니다.
이제 IDA로 열어줍니다.
올리디버거로 열면 머리아파지고 코드 보기 싫어지는데 IDA로 들어가니깐 그래프 그림으로 Main 함수를 바로 찾아주네요. 정말 쓸때마다 느끼는건데 너무 좋습니다 ㅋㅋ
물론 여기 Main 함수를 따라가면서 코드를 찾을건 아니고 항상 하던대로 Strings 탭에서 시리얼 값을 체크하는 분기 코드를 찾을겁니다.
딱봐도 이거네요...
시리얼 키를 체크하는 분기는 바로 저곳입니다. 코드가 착하게도 매우 간단하네요.
strcmp로 Str2와 AD46DFS547(Str1) 을 비교하고 있습니다. 지금까지 너무 많이 설명한 거 같은데 이제 다 생략하고 그냥 Str2가 우리가 입력한 텍스트고, Str1이 시리얼 키 입니다.
IDA에서 F5로 디컴파일 플러그인을 활용하면 더 쉽게 확인 가능합니다.
GetDlgItemTextA를 호출해서 Str2에 시리얼 박스에 우리가 입력한 입력값을 저장하고,
strcmp를 이용해 정답인 AD46DFS547와 우리 입력값을 비교해서 같으면 (strcmp는 두 문자열이 같으면 0을 반환함) NOT 연산을 통해 성공 메세지로 분기하고, 실패하면 실패 메세지로 분기합니다.
이제 OEP(Original Entry Point)를 찾아봐야 합니다.
OEP(Original Entry Point) 란 언패킹 되기 이전의 실행 파일 시작점 입니다.
패킹된 프로그램을 실행시키면 Unpacking Code(복호화 코드) 가 패킹된 데이터를 하나씩 읽어서 압축을 풀고, 공간에 원본 데이터를 저장하게 됩니다. 모든 코드가 언패킹되면 OEP에서 부터 프로그램이 시작됩니다.
원래라면 패킹된 프로그램에서 분석을 시작하면서 하나 하나 실행하면서 OEP를 찾고, 거기서부터 분석해야 됩니다만 현재는 UPX로 이미 언패킹을 해놔서 프로그램 시작점(EP) 가 곧 OEP(Original Entry Point) 입니다.
IDA에서 Ctrl + E 단축키를 누르면 이렇게 Entry Point를 쉽게 찾을 수 있습니다.
저기 00401360이 이 프로그램을 키면 제일 처음 실행하는 코드 주소 위치입니다.
정답인증은 OEP + Serial 이라고 했으니깐 답은
00401360AD46DFS547 이네요 ㅎㅎ
출처
'보안 강좌 > CodeEngn' 카테고리의 다른 글
[CodeEngn] Basic RCE L08 풀이 (0) | 2023.01.29 |
---|---|
[CodeEngn] Basic RCE L07 풀이 (0) | 2023.01.16 |
[CodeEngn] Basic RCE L05 풀이 (0) | 2023.01.11 |
[CodeEngn] Basic RCE L04 풀이 (0) | 2023.01.09 |
[CodeEngn] Basic RCE L03 풀이 (0) | 2023.01.06 |