일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 코드엔진
- forensic
- ctf
- Tree/Binary_Search_Tree
- Tree/Binary_Tree
- CS/자료구조/Circular_Linked_List
- codeengn
- CS/자료구조/Linked_List
- CS/자료구조/Doubly_Linked_List
- Tree/AVL/Deletion
- Tree/BST
- CS/자료구조/Circular_Queue
- Tree/Traversal
- Tree/RBTree/Deletion
- CS/자료구조/Queue
- reversing
- UTCTF
- Tree/AVL/Insertion
- 리버싱
- tree
- CS/자료구조/Priority_Queue
- Tree/AVL
- Tree/RBTree
- CS/자료구조/Stack
- Tree/RBTree/Insertion
- CS/자료구조/Singly_Linked_List
- Today
- Total
SuperVingo
CodeEngn.com Basic RCE L20 WriteUp 본문
마지막 문제답게 어려워보인다. 한번 도전해보자.
0. 실행화면
뭐 없다...
1. ExeInfoPE 분석
다행히 패킹은 되어있지 않으므로 분석을 바로 들어간다.
2. 올리디버거 분석
처음 ReadFile을 통해서 파일을 읽어온다. 그 후, 글자수가 0x12, 즉 18자인지 비교하므로 키파일의 크기는 18바이트여야한다. 그 후 함수와 비교를 통해 성공 문자열을 출력한다. 그럼 첫번째 Routine에 들어가보자.
EAX, ECX를 0으로 초기화한 후, BL을 0x41 ~ 0x4F까지 총 14번 반복한다. 그 사이에서 KEY에서 한자리씩 가져와 BL과 XOR연산을 진행한 후, 0x4020F9에 누적하고 있다.
그 후, 0x4020F9와 0x12345678를 XOR연산을 진행한 후, 0040133으로 넘어간다. 저 함수에서는 키 마지막 4자리를 가져와 EAX에 저장한다.
그 후, EAX와 0x4020F9를 비교하여 제로 플래그가 0인지 아닌지 확인하여 분기한다.
XOR의 연산의 특징은 연산을 2번 진행하면 원래의 값이 나오게 된다. 즉,
A XOR B = C일때, C XOR B = A라는 식이 성립하게 된다는 것이다.
그리고 위 REP 구문을 통해서 Cracked by: 뒤에 XOR 계산된 14바이트 글자가 들어가게 된다.
그럼 지금까지 과정을 정리하면 XOR된 CodeEngn을 앞 14바이트에 넣어주고, 누적된 값을 뒤 4바이트에 저장하면 된다.
#include <stdio.h>
int main(void)
{
char key[] = "CodeEngn";
int bl, i;
for(bl = 0x41, i = 0; bl <= 0x4F; bl++, i++)
{
key[i] ^= bl;
printf("%02x ", key[i]);
}
return 0;
}
위 코드를 통해서 XOR된 Hex데이터를 HxD를 통해 넣어줬다.
그 후 다시 실행을 해보면,
0x004020F9에 값이 있고, 이 값을 뒤 4바이트에 넣어주면
성공 문자열을 볼 수있었다.
'Wargame[워게임] > CodeEngn' 카테고리의 다른 글
CodeEngn.com Advance RCE L01 WriteUp (0) | 2020.08.05 |
---|---|
CodeEngn.com Basic RCE L19 WriteUp (0) | 2020.08.04 |
CodeEngn.com Basic RCE L18 WriteUp (0) | 2020.08.04 |
CodeEngn.com Basic RCE L17 WriteUp (0) | 2020.08.04 |
CodeEngn.com Basic RCE L16 WriteUp (0) | 2020.07.30 |