본문 바로가기
Security/Reversing

[CodeEngn] Challenges Basic RCE L10, L11, L12

by jino22 2021. 8. 15.

틀린 부분이 있다면 언제든지 댓글 남겨주세요! 


CodeEngn_Challenges Basic RCE L10

 

L10. OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오.

 

프로그램을 실행시키면 다음과 같이 이름과 시리얼 번호를 입력하는 메시지 박스가 나온다.

프로그램의 정보를 확인해 본 결과 Aspack으로 패킹되어 있음을 알 수 있다.

프로그램 정보

Aspack도 이전의 문제에서 했던 패킹 방법과 같은 방식으로 언패킹하면 된다.

POPAD이후 OEP로 분기

JNE이후 PUSH를 하는 경우 JUM와 동일하게 해당 주소로 이동하는 동작을 한다. 따라서 445834=OEP로 이동한다.

string문자열 중 "registered...well done!" 문자열이 등록 성공 문자열로 추측된다.

문자열 위쪽 코드를 보면 44552B로 분기하지 않으면 문자열을 만날 수 있다.

따라서 분기문의 OPCODE는 77 55, OEP는 445834로 정답은 004458347755 이다.

 


_Challenges Basic RCE L11

L11. OEP와 Stolenbyte 를 찾으시오.
정답인증은 OEP+ Stolenbyte  Ex) 00401000FF35CA204000E84D000000

 

파일을 실행시키면 다음과 같은 메시지박스가 뜬다.

파일은 UPX로 패킹되어 있으므로 

Ollydbg로 파일을 열어 하드웨어 BP를 걸어 OEP를 구한다.

POPAD이후 Stolenbyte로 추측되는 코드가 보이고, 스택을 다 0으로 초기화시키는 루프문 이후 OEP로 가는 JMP문이 보인다.

** L09번 stolenbyte참고 

OEP로 가보니 MessageBoxA API에 push 0으로 인자 1개만 전달하고 있는 코드가 보인다.

OEP

MessageBoxA API는 다음과 같이 매개변수가 4개이다. 

따라서 아까 추측했던 3줄이 StolenByte임을 알 수 있다.

원래의 코드를 복구하면 다음과 같다. 

입력할 때 바이트 크기를 주의한다. Ctrl+E 단축키를 사용한다.

StolenByte로 코드 수정 후 다시 언패킹 해보면 정상적으로 파일이 동작하는 것을 확인할 수 있다.

따라서 OEP= 401000, StolenByte= 6A 00 68 00 20 40 00 68 12 20 40 00이다.

정답 004010006A0068002040006812204000


_Challenges Basic RCE L12

L12. Key를 구한 후 입력하게 되면 성공메시지를 볼 수 있다.

이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하려면 파일을 HexEdit로 오픈 한 다음 0x???? ~ 0x???? 영역에 Key 값을 overwrite 하면 된다.
문제 : Key값과 + 주소영역을 찾으시오

 

패킹된 파일은 아니므로 편하게 봐도 되겠다.

파일을 실행시키면 오른쪽 사진과 같이 KEY를 입력하는 메시지박스가 뜬다.

 

ollydbg로 파일을 열어보았다. 

GetDlgItemIn API는 메시지 박스에 입력한 값을 정수형(16진수)으로 변환하여 반환된다.

만약 숫자가 아닌 값이 들어있다면 0을 반환한다.

403000에 들어있는 문자열이 KEY값인 줄 알았는데 이후 코드를 보니 그냥 문자열을 하나씩 도는 루틴이고 루틴이 끝나면 결국 사용자가 입력한 EAX가 다시 들어가게 된다. 

디버깅을 방해하기 위한 의미없는 루틴으로 보인다.

 

EAX와 7A2896BF값이 같은지 비교한 후 MessageBox API를 통해 결과를 출력하는 것으로 보인다. 

7A2896BF값은 16진수이므로 10진수로 변환하면 2049480383인데 이 값이 KEY값이다.

* 왜 10진수값이 KEY값이냐면 사용자가 값을 입력하면 GetDlgItemIn에서 16진수값으로 반환되는데 이 값과 KEY값을 비교하기 때문이다.

따라서 사용자가 입력할 KEY값은 10진수인 KEY이다.

MessageBoxA API에 출력할 text는 40353B에 저장된 값이다. 

따라서 이 값을 KEY값으로 overwrite해주면 된다.

 

HxD로 해당 파일을 열어 해당 위치를 찾으려고 한다.

overwrite할 주소가 ollydbg에서 40108B였는데 이 주소는 VA값이므로 RAW값으로 바꿔준다. 

RVA = 40353B(VA) - 400000(ImageBase) = 353B

RAW(Fileoffset) = 353B(RAV) - 3000(VA) + 800(PointerToRawData) = D3B

* VA값을 PEView에서 확인 할 때에는 RVA라고 설명되어 있는 부분을 보면 됨!

* .data부분으로 보는 이유: .rsrc는 VA가 4000, .data는 VA가 3000이므로 353B값이 .data내에 있음을 알 수 있다.

찾은 위치로 가보면 ollydbg에서 확인한 데이터와 같은 데이터가 들어있는 것을 확인할 수 있다.

이 데이터가 메시지 박스에 출력할 텍스트를 저장해 둔 주소이므로 이 값을 바꾸면 된다. 

* overwrite할 때 데이터 크기가 변하지 않도록 주의한다.

값을 바꾸고 다시 실행해 KEY값을 입력해 보면 다음과 같이 메시지박스에 KEY값이 뜬다.

따라서 답은 key값 = 2049480383, 주소값 = D3B-D45이다.

728x90
반응형

댓글