CodeEngn Basic RCE L07
Q. 컴퓨터 C 드라이브의 이름이 CodeEngn 일 경우 시리얼이 생성될때 CodeEngn은 'ß어떤것'으로 변경되는가
-abex 5번 문제와 동일
일단 프로그램을 무작정 실행시키고 체크 버튼을 누르면 not correct 메시지가 뜨는 것을 확인할 수 있다.
그리고 문제에서 컴퓨터 C 드라이브의 이름이 CodeEngn이라고 했으니, 내 컴퓨터 드라이브 이름을 변경해주었다
GetDigItemTextA 를 통해 입력한 문자열을 받아들일 것이다.
GetVolumInformation 은 사용자의 volume 정보를 읽어들일 것이다.
그리고 VolumnNameBuffer 가 있으니 여기에, 즉 0040225C에 정보가 저장이 될 것이며,
IstrcatA 가 있으니 StringToAdd의 4562-ABEX와 합쳐질 것이다.
그 다음에는, 2회 반복문으로 인해, 합쳐진 문자열의 맨 앞 4byte가 2씩 더해진다.
그 후, L2C-5781이 문자열에 합쳐질 것이다.
컴퓨터 C 드라이브의 이름이 CodeEngn 일 경우라고 문제에서 말했으므로, 문자열 앞 4byte를 각각 2씩 더하면 앞의 Code가 Eqfg이 되어, EqfgEngn 이 될 것이다.
즉, 올바른 시리얼 번호는 L2C-5781EqfgEngn4562-ABEX 이고,
정답은 EqfgEngn 이다.
08번 코드엔진
문제: OEP를 구하시오 Ex) 00400000
Oep를 구할 수 있는 방법이 여러가지 있음
먼저 peid를 통해 이 파일을 알아볼 것인데 upx형태로 언패킹 된 것을 확인 할 수 있음
언패킹을 하지 않고 oep를 알아보는 방법과 언패킹을 하여 oep를 하는 방법을 모두 알아볼 것이다.
-언패킹을 하지 않고 알 수 있는 방법
1) 올리디버거로 파일을 열어준다
2) 맨 처음에 pushad라는 명령어를 확인 할 수 있다. 이는 패킹된 파일에서 나타나는 형태임
3) Pushad를 찾았다면 코드중에 popad를 찾아보자
4) 01020DBD주소에 popad가 있음을 확인할 수 있음
5) 이 밑에 나오는 jmp명령어가 가르키는 주소가 oep주소임
- 언패킹을 진행하여 oep를 알아보는 방법
1) 명령 프롬포터에서 언패킹하고자 하는 파일에 접근한다
2) upx.exe –d 파일명 형태로 입력하여 언패킹을 진행한다.
3) 이때 파일이 올리디버거에 올라가 있으면 바로 아래와 같이 오류가 뜰 수 있음
4) 실행을 중지하고 언패킹을 진행하니 성공적으로 언패킹이 이루어졌음을 확인할 수 있음
5) 성공적으로 언패킹을 진행하였다면 이제 올리디버거에 올려보도록 하자
6) 올리디버거로 실행시켰을 때 맨처음 주소가 oep가 된다
7) 따라서 oep는 01012475이다.
9번 문제
StolenByte를 구하시오 Ex) 75156A0068352040
StolenByte 란?
프로그램의 어떤 부분의 코드를 다른 부분으로 옮긴 코드이다. 조금 더 쉽게 말하면 옮겨지는 코드들은 대부분 OEP 위에 코드들이 JMP 구문으로 OEP에 도달하기 전 코드들이다. 주로 패킹과 동시에 이루어지는 것 같다.
이제 프로그램을 실행시켜보겠다.
프로그램이 잘 작동된다.
이제 올리디버거에 프로그램을 올려 분석해주겠다.
코드들을 실행시켜줘도 큰 변화가 일어나지 않고 무엇보다 주석,힌트 등 코드들이 수상하게 생겼다.
이제 ExeinfoPE 프로그램에 이 파일을 올려 패킹이 된게 맞는지 확인해주겠다.
아래쪽 두 줄을 확인해보면 이 파일이 UPX로 패킹되어있기 upx.exe -d 명령어로 언패킹을 진행해줘야 한다는 것을 알 수 있다. 어차피 언패킹을 진행해줘도 코드가 완전하지 않아 제대로 된 프로그램이 실행되지 않을 걸 알기에 이 부분은 패스하겠다.
사실 해봤었다...
이렇게 프로그램이 제대로 실행되지 않는다.
ollydbg에 다시 파일을 올려 분석을 진행해주겠다.(OEP를 찾는 게 급하다.)
OEP를 찾는 방법은 아래 블로그 포스팅에 잘 나와있으니 참고하셨으면 한다.
https://honorlog.tistory.com/5
오른쪽 마우스 -> Search for -> All commands -> popad 입력 후 검색을 통해 pushad에 인접한 popad 주소로 이동해주겠다.
popad 명령어 주소에 BP를 걸고 거기까지 실행시키면 아까 뜬 오류 문자열이 나타난다. 좀 이상한 점이 있다면 메시지 박스 함수가 보이지 않고 문자열만 떡하니 있다는 것이다.
코드 가장 마지막 줄을 확인해보면 JMP 명령어가 있다는 것을 알 수 있다. JMP 명령어로 이동하는 주소가 OEP이다. OEP로 이동해보겠다.
이동하니 이곳에도 수상한 주소가 보인다. 0040100E 주소와 메시지 박스를 호출하는 다른 주소들과의 차이점을 보면 push로 인자를 한개 밖에 받지 않았다. 기본적으로 MessageBox를 호출할 때는 파라미터 4개를 받아준다. 앞에서 수상했던 코드들의 주소들을 다시 확인하면 push 명령어로 3개의 값들을 스택에 넣어주고 12바이트라는 것을 볼 수 있다. OEP위에 붕 뜨는 주소들의 바이트 값을 확인하면 12바이트라는 것을 알 수 있다. 그래서 JMP 명령어 전에 있던 push 명령어로 구성된 3 주소가 stolenbyte라고 추측할 수 있다.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa
JMP 명령어 전에 있던 push 명령어를 쓰는 주소 3줄을 긁어오겠다. 기계어 코드를 긁어와 오른쪽 마우스 -> Bianry -> Edit에 기계어 코드를 붙여주면 된다.
이제 수정된 코드들을 덤프로 저장해주겠다.(덤프는 따로 다운받아 plugin 폴더에 넣어주어야한다.)
엔트리포인트가 새롭게 바뀌었으니 1000으로 수정해준다. 덤프를 눌러 새로운 파일로 저장해주고 정상적으로 작동하는지 실행시켜보겠다.
잘 실행된다.
따라서 답 StolenByte는 OP코드인 6A0068002040006812204000 이다.
10번문제
OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오.
정답인증은 OEP + OPCODE EX) 00400000EB03
[OEP]
unpacking을 할 때 packing되기 전으로 돌아가는 곳. OEP를 알면 원본 파일의 분석이 가능하다고 한다.
일반적인 packer는 처음에 모든 레지스터들을 스택에 push한 뒤 unpack 작업을 위한 루틴을 시작한다고 한다. unpack루틴이 끝난 후에 원래 프로그램의 entry point를 시작하기 전에 처음에 스택에 저장한 레지스터들을 pop하는 형식이다. (pushad와 popad가 한쌍이 된다)
처음 push로 스택에 레지스터들을 올려놓은 후 EDI 레지스터에 bp를 걸면 unpack루틴이 끝난 후에 프로그램을 시작하기 위해 레지스터드를 pop하는 시점에 bp가 걸린다. 이 때 return address를 확인하면 OEP를 찾을 수 있다.
파일을 실행했다.
PEiD를 통해 ASPack 되어있는 것을 확인했다.
VMUnpacker을 통해 패킹을 풀었다.
파일을 열어보니, OEP는 00445834 임을 알 수 있다.
텍스트를 확인해보면 registered … well done!d 이라고 등록에 성고했을 때 등장하는 문자열이 보인다. 이를 클릭한다.
조금 위로 올려보면 점프문이 하나 등장하는데, 이 점프문에 걸릴 경우 등록 성공 메시지를 띄우는 부분을 건너뛰게 되므로 이 코드가 등록 성공으로 가는 분기점임을 알 수 있다. 따라서 이 코드의 opcode는 7555이다.
'2. Reversing (리버싱) > 1) Write UP' 카테고리의 다른 글
[2021.11.06] Codeengn 12 (0) | 2021.11.13 |
---|---|
[2021.11.06] Codeengn 11,Nag 창 없애기 (0) | 2021.11.07 |
[2021.09.25] abex crackme 5, PE파일 (0) | 2021.10.04 |
[2021.09.25] CodeEngn Basic RCE L05, L06 풀이 (0) | 2021.09.25 |
[2021.09.18] CodeEngn Basic RCE L03, L04 풀이 (1) | 2021.09.18 |