이번 문제는 다음과 같습니다.
코드 패치문제로 보입니다.
먼저 exeinfope로 열어보겠습니다.
32비트 실행파일이고 어셈블리 프로그래밍된 프로그램인것으로 파악됩니다.
이제 한번 프로그램을 실행시켜보면
다음과 같이 키값을 입력한뒤 Check 버튼을 누르면 키값을 검사하는 방식일것으로 보입니다.
About은 그냥 이 프로그램에 대한 간단한 설명을 띄워줍니다.
이제 한번 IDA를 통해서 분석해보겠습니다.
우선 키값을 검사하는 로직을 찾기위해서 관련된 문자열을 먼저 찾아봤습니다.
가운데 문자열을 보면 아까전에 프로그램을 실행시키면 나오는 메세지박스의 이름인것을 알수 있습니다.
그러므로 이 문자열이 쓰이는 함수로 진입하면 키값을 검사하는 로직도 찾을수 있을것입니다.
그리고 다른 문자열들도 뭔가 관련되어보이는 문자열인것 같으므로 한번 진행해보겠습니다.
이 문자열들은 모두 같은 함수에서 쓰인다는것을 알수 있습니다.
그러므로 이 함수로 진입해보겠습니다.
함수의 구조를 보면 살짝 복잡해 보이지만 사실 별거 없습니다.
이 코드를 보면, 기본적인 메세지박스를 띄우는 작업을한뒤
아까전에 봤었던 굉장히 긴 문자열을 앞에서부터 4자리 가져다가
eax & -(ebx + 1) + ebx & -(eax + 1)
다음과 같은 연산을 한뒤 eax에 반환하는 작업을 반복합니다.
마지막 자리까지하면 반복을 멈춘뒤, 방금전에 노가다 연산을 한 마지막 값과 2049480383를 비교해서
두 값이 같으면 성공 메세지를 반환하는것으로 보입니다.
뭔가 굉장히 복잡한 연산을 하는것으로 보이지만 분석을 해보면 쓸데없는 연산과정이란것을 알수 있습니다.
왜냐하면 이렇게 계속 연산해서 나오는 최종 결과값은 처음에 입력했던 값이기 때문입니다.
1111111111 이라는 값을 입력한뒤 디버깅 해보면
정수형값을 받는 함수가 호출된뒤 eax 값을 보면
다음과 같은 값이 나옵니다
이 값은 1111111111을 16진수로 표현한 값입니다.
그런데 아까전에 봤었던 노가다 연산을 끝마친뒤 최종값인 eax값을 보면
아까전과 똑같은 값이란것을 알수있습니다.
그러므로 이 연산과정은 분석을 어렵게하려고 만든 쓸데없는 연산이므로 무시하면 됩니다.
아까전에 봤던것과 같이 2049480383와 값을 비교해서 같으면 성공메세지가 출력되므로
올바른 키값은 2049480383이 되는것입니다.
이제 키값은 알아냈으므로 HexEdit로 어느 부분을 overwrite해야 하는지 알아보겠습니다.
HxD 로 쭉 내리다보면 다음과 같이 아까전에 봤었던 성공메세지 문자열이 보입니다.
이 문자열 영역을 00(널바이트)로 먼저 채운뒤 첫 주소부터 키값으로 채워야 합니다.
그렇다면 키값을 overwrite 해야하는 주소는 D3B ~ D44 입니다.
이 부분을 키값으로 덮고
한번 실행시켜서 키를 입력해보면
다음과 같이 성공적으로 키값이 출력되는것을 볼수 있습니다.
그러므로 이 문제의 정답은 2049480383D3BD44 일것입니다.
그런데 틀린답이라고 합니다...?
분명 제대로되는것을 보면 맞는거 같은데 도데체 왜 틀렸다고 하는건지 이해가 안갔습니다.
도데체 왜그런것인가 곰곰히 생각해보니, 문자열은 뒤에 널바이트가 있어야 한 문자열이 끝났다고 판단하기때문에
overwrite 해야하는 영역은 널바이트를 포함한 영역인 D3B~D45 인것입니다.
저는 먼저 모든 문자열을 널바이트로 바꿔버린뒤에 키값을 넣어서 이 부분을 간과한것입니다.
그러므로 진짜 정답은 2049480383D3BD45 인것입니다.
그런데 또 정답이 아니랍니다.
그래서 왜 안되는것인지 이것저것 찾아봤는데
문제 설명을 잘보면 주소영역의 자릿수가 ????라고 되어있습니다.
4자리로 표현된것을 보아하니 D3B~D45가 아닌 0D3B~0D45를 기준으로 값을 입력해야하는것 같습니다.
그러므로 진짜 정답은 20494803830D3B0D45 입니다.
'워게임 > CodeEngn' 카테고리의 다른 글
[CodeEngn] Crypto Analysis L02 (0) | 2022.07.04 |
---|---|
[CodeEngn] Crypto Analysis L01 (0) | 2022.07.03 |
[CodeEngn] Basic RCE L11 (0) | 2022.07.03 |
[CodeEngn] Basic RCE L10 (0) | 2022.07.02 |
[CodeEngn] Basic RCE L09 (0) | 2022.05.19 |