코드엔진 13번 문제
Q. 정답은 무엇인가
파일을 실행하면 패스워드를 입력하라는 창이 나온다.
PEiD를 통해 파일을 살펴보니 C#으로 파일이 되어있는 것을 확인할 수 있었다. OllyDbg에서의 분석이 되지 않길래 찾아보니 C#으로 되어있는 파일은 OllyDbg와 같은 동적 분석 도구로 분석할 수 없다고 한다.
찾아보니 dotPeek로 C#으로 작성된 파일을 분석할 수 있는 것 같아 설치하고 파일을 열어보았다.
File-Open으로 13번 파일을 불러오고,
ConsoleAppllication3 - Root Namespace – RijndaelSimpleTest – Main 을 누르면 소스코드가 뜬다.
확인해보니 Console.ReadLine() == str 이어야 else로 빠져나가고, well done 메시지가 출력된다고 한다.
Export to project를 눌러 비쥬얼 스튜디어에서 코드를 확인해보았다.
비쥬얼 스튜디오에 export to project한 13번 파일을 열어준 후, RijndaelSimpleTest.cs를 누르면 코드를 볼 수 있다.
다음과 같이 적혀있는 부분에서, Console.WriteLine(str);라는 코드를 추가하여 str이라는 정답을 확인하고자 한다.
다음과 같이 코드를 수정하고 실행시켜보면 bad luck 메시지가 뜨기 전 str, 즉 정답이 뜬다.
정답은 Leteminman인 듯 하다.
이를 정답으로 입력하면 well done 메시지가 뜨는 것을 확인할 수 있으므로, 정답은 Leteminman이다.
코드엔진 14번 문제
파일이 upx로 언패킹 되어있음을 알 수 있다.
Upx 압축 풀어주고 확인
올리디버거로 열어 비밀번호를 만드는 것으로 예상되는 부분을 찾았다.
[비밀번호 만드는 루틴]
xor로 esi를 0으로 만들고, eax를 1로 만든다.
ID 길이만큼 for문을 돌리고, for문이 1부터 시작이다.
그리고 403038은 CodeEngn -> 입력한 id 값
1. mov dl, byte ptr ds:[eax+403037]는 dl = name[i] 라고 볼 수 있습니다.
2. edx를 0xff와 and연산 합니다. (edx = edx & 0xff)
3. ebx에 edx값을 넣고 ebx *= edx를 합니다. 편하게 생각하면 ebx = edx*edx 입니다.
4. esi += ebx
5. ebx = edx
6. ebx = ebx >> 1
7. esi += ebx
8. esi -= edx
해석한 것을 바탕으로 코드를 완성하여 실행시키면 비밀번호를 획득할 수 있다.
코드엔진 15번 문제
Name이 CodeEngn일때 Serial을구하시오
1. Search for -> All referenced strings 를 이용해 잘못된 시리얼을 입력했을 때 뜨는 메시지를 찾기
2. 그 메시지 주소로 이동
3. 실패 메시지로 이동하니 성공 메시지로 추측되는 문구가 보임.( 아마 근처에서 값을 비교하고 성공 또는 실패 메시지로 이동하는 분기문이 있을 것이라고 추측)
4. 458831주소에 EAX 레지스터 값과 특정 값을 비교하는 분기문 발견
5. 프로그램을 실행시킨 후 BP에서 멈추도록 한다
6. follow in dump -> memory 를 이용해 메모리 주소로 찾아간다.
7. 메모리 주소 458844에서 4바이트 값 6160 발견.
8. EAX 레지스터의 값을 6160으로 변경
9. 한줄씩 실행시켜보기
10. 실패 메시지로 점프하지 않고 순서대로 실행됨.
11. 성공 메시지 주소에 다다르자 성공 메시지 박스가 나타남.
따라서 시리얼 값은 16진수 6160이고 이를 10진수로 변환하면 24928이다.
시리얼 값 : 24928
코드엔진 16번 문제
Name이 CodeEngn일때 Serial을 구하시오
실행
올리디버거로 열기
시리얼을 구하는 문제이기 때문에 성공 문자열을 출력하는 곳으로 접근하고자 search for -> all referenced text strings로 접근
성공문자열인 good job!으로 들어가기
여기서 중요하게 봐야할 부분은 CMP EAX [EBP-3C] 부분임. EAX와 메모리 주소[EBP-3C]에 있는 4byte와 비교. JNZ 명령어는 비교함수의 두 변수값이 다를 경우 점프함. 점프할 경우 실패 문자열이 있는 주소이기 때문에 점프하지 않아야 성공 문자열 출력. EAX와 EBP를 알아내야함 CMP 부분에 브레이크 걸고 프로그램 실행
임의의 값인 123입력
EAX에는 123이 16진수로 변환되어 들어갔고 EBP는 0070FF28이라는 값을 가지고 있음을 확인
0070FF28 - 3C = 0070FEEC임. 즉 0070FEEC에 있는 값의 4byte와 EAX값 비교. 메모리 주소에 있는 4byte를 알아내야하기 때문에 아래와 같이 접근
리틀 앤디언으로 읽으면 E4C60D97임 즉 EAX값이 E4C60D97이 되어야함. 그런데 앞에서 십진수로 입력했을 때 16진수로 변환되어 저장되었기 때문에 우리도 10진수를 입력해주어야함.
E4C60D97를 10진수로 변환하면 3838184855임.
이제 다시 실행하여 비밀번호를 집어넣었더니 성공 문자열 출력.
'2. Reversing (리버싱) > 1) Write UP' 카테고리의 다른 글
[2022.03.12] 활동일지 (리버고고싱) (0) | 2022.03.12 |
---|---|
[2021.11.20] CodeEngn Basic RCE L17, L18, L19, L20 풀이 (0) | 2021.11.21 |
[2021.11.06] Codeengn 12 (0) | 2021.11.13 |
[2021.11.06] Codeengn 11,Nag 창 없애기 (0) | 2021.11.07 |
[2021.10.09] CodeEngn Basic RCE L07, L08, L09, L10 풀이 (0) | 2021.10.09 |