woonadz :)

[CodeEngn Basic] RCE L06 문제 풀이_nabi 본문

IT/codeengn 문제 풀이

[CodeEngn Basic] RCE L06 문제 풀이_nabi

C_scorch 2021. 9. 25. 23:57
반응형

기록용 

3줄 TMI

오늘 codeengn basic 05,06을 업로드하려고 한다. 더이상 미루면 안될 것 같아서 최대한 오늘 끝내려고 쓰고 있는 중이다. 다음주에는 동아리 소모임 활동이 없기에 밀린 02,03,04 문제 풀이를 올릴 예정이다. 또 다다음주부터는 시험기간 시작이어서 약 3주간 인공지능 관련 공부 기록 외에는 포스팅이 올라오지 않을 예정이다. 

참고로 인공지능 관련 공부는 저작권 문제로 비밀번호를 걸어놓았다. 아마 나만 복습용으로 조회할 것 같다.


6번 문제도 upx 를 통해 언패킹 하는 과정이 필요하다.

언패킹 과정은 이 포스팅을 참고하면 된다.

https://scorchingnraining.tistory.com/entry/CodeEngn-Basic-RCE-L05-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4nabi

 

[CodeEngn Basic] RCE L05 문제 풀이_nabi

기록용 3줄 TMI 순서대로 문제 풀이 포스팅을 올리고 싶었지만 지금 밀린 과제나 해야할 것들이 많아서 일단 5,6을 먼저 올려야 될 것 같다. 2,3,4는 다음주 중에 한번 더 풀어서 올려야겠다. 추석

scorchingnraining.tistory.com

 

Unpack을 한 후 Serial을 찾으시오. 정답인증은 OEP + Serial
Ex) 00400000PASSWORD

 

06.exe 파일 실행
123 값 입력 후 에러 메시지

123 이라는 값을 입력해보았는데 역시나 에러 메시지가 떴다. 

파일을 한번 실행시켜보았으니 이제 올리 디버거로 문제를 풀어보겠다. 풀이를 시작하기 전 나는 이 문제를 5번 문제와 비슷한 맥락으로 풀었다. 이 점을 기억하고 5번 포스팅과 비교하며 보면 재밌을 듯 하다.

 

entrypoint

upx 로 언패킹을 하고 올리 디버거에서 06.exe 파일을 열면 이런 화면이 보인다. 여기서 우리가 알 수 있는 점은 00401360 주소가 EntryPoint 라는 것 외에는 없다. 이제 한줄씩 실행해보려 한다.

 

쭉 한줄씩 실행하며 내려가다 보면 0040146E 주소에서 메시지 창을 불러온다. 이 주소 안으로 들어가보겠다.(F7)

 

40100F 주소로 이동

40100F 주소로 이동했다. 이 주소를 실행시켜보겠다.

 

40100F 주소 실행

이후 RETN 까지 실행시켜보았지만 딱히 큰 변화는 없었다...(사실 여기서 조금 멘붕이 와서 어떻게 풀어야 할지 고민을 많이 한 것 같다.)

다시 처음으로 돌아가보겠다.

 

오른쪽 마우스 클릭 -> Search for -> All referenced text strings 을 통해 아까 에러 메시지가 뜬 문자열 주소로 이동할 것이다. 사진에서 5번째 줄을 더블 클릭하면 이동된다.

 

Wrong serial 문자열 주소로 이동

Wrong serial 문자열 주소로 이동하였다. 이 문자열이 포함된 함수 가장 처음으로 올라가 BP(breakpoint)를 설정하고 다시 실행시켜보겠다.

 

401030 주소 전까지 실행

현재 401030 주소 전까지 실행 한 상태이고 이제 한줄씩 실행시키며 레지스터가 어떻게 변하는지 볼 것이다.

 

40105C 주소까지 실행 시킨 상태

40105C 주소를 실행시키자 401069 주소 주석란에 내가 쓴 serial 값이 들어갔다. 다시 또 한줄씩 실행시켜보겠다.

 

00401073 주소를 실행시킨 상태

00401073 주소를 실행시키자 ECX 레지스터와 EDX 레지스터에 각각 내가 입력한 serial 값과 40106E 주소 주석란에 있는 아스키 값이 들어갔다.(serial 값이 AD46DFS547이라고 추측) 그리고 EAX 레지스터 값이 1로 바뀌었다. 다음줄을 실행시키겠다.

 

40107B 주소까지 실행한 상태

TEST 명령어 : 인수 1과 인수 2의 내용을 AND 연산하여 결과가 0이면 ZF를 1로 설정한다.현재 EAX 레지스터를 보면 알 수 있듯이 1을 AND 연산하여 ZF 값에 0이 입력되었다.ZF값이 0이므로 그 다음줄을 실행하였을 때 004010A3 주소로 점프할 것을 추측할 수 있다.따라서 우리는 성공 문자메시지를 출력시킬 수 있는 조건을 가정하여 serial 값이 AD46DFS547가 맞는지를 증명해보겠다.증명은 두가지 방법으로 가능하다.첫째, EAX 레지스터가 1로 바뀐 부분을 0으로 바꿔준다.둘째, ZF 값을 1로 바꿔준다.

두번째 방법은 이미 1번 문제에서 사용한 적이 있기에 첫번째 방법으로 풀이를 진행하겠다.(두번째 방법이 궁금하다면 1번 문제 포스팅을 읽어보시길..)

 

EAX 레지스터 값이 바뀐 401073 주소를 실행시켰다. 그 후 EAX 레지스터의 값을 1에서 0으로 바꿔주었다.

 

쭉 실행을 시켜보았는데 점프 없이 성공했다는 메시지 박스가 잘 출력이 된다. 이로써 우리는 serial 키가 AD46DFS547라는 것을 증명 했고 또 하나의 추측이 가능하다. 위 사진에서 실행시킨 CALL 함수는 기본 serial 값과 내가 입력한 값을 비교하여 같을 경우 EAX 레지스터에 0을 입력, 다를 경우 1을 입력한다는 것이 추측 가능하다.

 

AD46DFS547 값을 프로그램을 실행해 입력해보겠다.

성공!!!!

정답 serial 값은 AD46DFS547이다.

참, OEP값은 간단하다. 

OEP란 실행프로그램에 실제 시작점이므로 프로그램을 켰을 때 가장 먼저 나오는 주소인 00401360 이 답이다.

 

 

 

끝인사 및 느낀점

아직 이런 유형(일련번호를 알아내는..?)의 문제를 많이 보진 못했지만 5번과 6번,내가 책에서 공부한 유형까지 합쳐 총 3문제를 본 결과 느낌점이 있다. 이런 유형의 문제는 대부분 JNZ 명령어를 많이 사용하는 것 같다. 내가 그 두가지 유형을 비슷한 방법으로 풀어서 더 그렇게 느끼는 걸지도 모르지만 ZF 값을 이용해 조건에 따라 이동여부가 달라지는 명령어들(JNZ 명령어와 같이)은 더 눈에 불을 키고 의심을 하며 푸는게 빨리 답을 찾는 방법 같다.

 

시험기간 동안 동아리 활동을 안하면 시간이 좀 남을 것 같기도 해서 백준 알고리즘 문제를 주마다 한개씩 정해놓고 문제풀이와 알고리즘 개념 정리를 같이 진행할까 고민중이다. 알고리즘, 자료구조는 어떤 종류가 있다 정도만 알고 있지 세세하게 공부해본적은 없어서 이번 2학기에 필요한 활동이 아닐까 싶다. 지금 동아리 활동 2개를 완벽하게 활동하려면 알고리즘 문제 풀이는 조금 벅찰 것 같아서 다다음주까지 조금 더 고민을 해보고 결정할 생각이다.

 

또 여담으로 다른 사람들은 문제 풀이 포스팅 시간이 어느 정도 걸리는지 궁금하다. 첫포스팅 하기 전에는 30분 정도면 다 쓰고 올릴 줄 알았는데 지금은 1시간~1시간 30분 정도 걸린다. 솔직히 시간이 많이 걸린다. 걱정하는건 비효율적인 포스팅을 하고 있는게 아닌가 해서다. 너무 많은 정보와 지나친 시간 투자 이런게 걱정이 된다. 1시간동안 한걸 30분만에 끝낼 수 있다면 당연히 1시간 동안 작성한 포스팅은 비효율적이라고 할 수 있다. 친한 사람들 중에 IT 관련 블로그를 하는 사람이 없어서 물어볼 수 없다는게 아쉽다. 

반응형