일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 티스토리챌린지
- 업스테이지패스트캠퍼스
- 패스트캠퍼스업스테이지에이아이랩
- 패스트캠퍼스
- 패스트캠퍼스AI부트캠프
- UpstageAILab#국비지원
- 오블완
- 국비지원
- 패스트캠퍼스업스테이지부트캠프
- UpstageAILab
- Today
- Total
김민주
[Dreamhack] rev-basic-3 본문
문제는 다음과 같다.
correct를 출력하는 flag를 찾는 간단한 문제인 것 같다.
우선, 문제에서 주어진 exe 파일을 x64dbg 프로그램에서 열었다.
문자열 참조 찾기로 correct를 찾았다.
correct 직전에 flag 값과 입력값을 비교할 것이므로 해당 함수의 어셈블리어를 확인해보겠다.
[cmp rax, 18] 부분을 보면 입력값을 0x18번 비교하는 것으로 보아, flag 길이는 0x18=24임을 알 수 있다.
사용자 입력 값은 [lea ecx, qword ptr ds:[rcx+rdx*2]] 부분에서 비교한다.
ecx는 사용자 입력 값을 저장하고, rcx는 메모리에 올라와있는 값을 가져오는 역할이다.
따라서 [lea rcx, qword ptr ds:[7FF6C4AD3000]] 구문에서 7FF6C4AD3000 주소에 있는 rcx 값을 보면 될 것 같다.
메모리에 저장되어 있는 비교 문자열의 길이는 24이므로 값을 확인해보면,
16진수 값은 49 60 67 74 63 67 42 66 80 78 69 69 7B 99 6D 88 68 94 9F 8D 4D A5 9D 45이고,
10진수 값은 I`gtcgBf.xii{.m.h...M¥.E이다.
어셈블리어 코드를 보면 rcx에 올라간 문자열과 사용자의 입력 값을 그대로 비교하는 것이 아니라
사용자의 입력 값을 연산하여 rcx의 값과 비교하고 있으므로, 연산과정을 역연산하여 FLAG를 찾아야 한다.
구글링을 통해 사용자의 입력 값이 연산되는 식은 다음과 같다는 것을 알 수 있었다.
- str : 메모리에 저장된 비교 문자열
- input : 사용자가 입력한 문자열
- i : 문자열 카운트를 위한 정수형 변수
연산식 : (input[i]^i)+(i*2)=str[i]
해당 연산을 통해 메모리에 저장된 문자열과 비교를 하기 때문에
사용자가 입력해야할 값을 추측하기 위해서는 input[i]의 값을 역연산 해야 한다.
따라서 역연산 식을 구하는 과정은 다음과 같다.
1. (input[i]^i)+(i*2)=str[i] // 기본 연산식
2. (input[i]^i)=str[i]-(i*2) // 양변에 -(i*2) 추가
3. input[i]=(str[i]-(i*2))^i // 양변에 ^i 추가 > 역연산 식
해당 연산을 비교 문자열 길이인 i=24로 놓고 파이썬으로 코드를 작성해보았다.
실행 시키면 flag 값이 나온다.
flag: DH{I_am_X0_xo_Xor_eXcit1ng}
문제 풀이 성공.
basic 문제임에도 난이도가 있었다.
'SWUFORCE > [공통] 리버싱 스터디' 카테고리의 다른 글
[Dreamhack] rev-basic-4 (0) | 2023.08.07 |
---|---|
[Dreamhack] rev-basic-2 (1) | 2023.05.16 |
[Dreamhack] rev-basic-1 (0) | 2023.05.03 |
[Dreamhack] rev-basic-0 (0) | 2023.04.04 |