rev-basic-3


문제

문제는 다음과 같다.

[그림1] rev-basic-3 문제

 

해당 파일을 실행했을 때, Input에 틀린 답을 입력했는지 Wrong이 출력된다.

Correct를 출력하기 위해 올바른 답을 찾아보자.

[그림2] rev-basic-3 실행


풀이

값을 입력받는 곳까지 실행해준다. 그럼 Call chall3.7FF6992C1120에서 멈추게 되는데 호출되는 이 함수 안으로 들어가보자.

[그림3] Input

 

들어가보면 Correct와 Wrong을 볼 수가 있다.

Correct 직전에 호출되는 함수에서 입력받은 값과 메모리 값을 비교할 것이기 때문에 Call chall3.7FF6992C1000으로 들어가보자.

[그림4] chall3.7FF6992C1120

 

들어가서 어셈블리어를 확인해보면 반복문을 통해 입력받은 값과 메모리 값을 비교한다는 것을 알 수 있다.

[그림5] chall3.7FF6992C1000

 

어떤 반복문인지 확인해보기 위해 편리하게... IDA를 이용했다.

A와 B가 같지 않아야 return 0을 실행하고 이를 총 24번 반복하는 반복문이었다.

[그림6] IDA chall3.exe 반복문

 

다시 x64dbg로 돌아가서 어셈블리어를 확인해봤더니

lea rcx, qword prt ds:[7FF6992C3000]을 보면

7FF6992C3000 주소rcx 값이 저장되어 있다는 것을 알 수 있다.

rcx에 값이 저장되어 있다는 것을 알게 됐으니 해당 주소로 따라갔다.

[그림7] lea rcx, qword prt ds:[7FF6992C3000]

 

해당 주소로 가보면 24개의 문자들이 있는 것을 확인해볼 수 있고, 여기 이 문자들로 우리가 입력한 값을 비교한다는 것을 알았다. 하지만 우리가 입력한 값을 그대로 비교하는 것이 아니라 xor 연산을 통해 바꾸어 rcx 값과 비교한다.

그렇기 때문에 이 값들을 역연산해야 한다. 

24개의 문자들은 우리가 알기 때문에 코드 짜는 데엔 문제가 없을 것이다.

[그림8] 7FF6992C3000

 

[그림9] rev-basic-3.py

 

 

[그림10] 출력값


답: I_am_X0_xo_Xor_eXcit1ng

'CTF > Reversing' 카테고리의 다른 글

[DreamHack] rev-basic-2 문제 풀이  (0) 2022.02.13
[DreamHack] rev-basic-1 문제 풀이  (0) 2022.02.10
[DreamHack] rev-basic-0 문제 풀이  (0) 2022.02.10

rev-basic-2


문제

문제는 다음과 같다.

[그림1] rev-basic-2 문제

해당 파일을 실행해봤을 때 chall0.exe, chall1.exe랑 동일하게 Input에 틀린 답을 입력하면 Wrong이 출력된다.

Correct가 출력되도록 올바른 값을 찾기 위해 분석해본다.

[그림2] rev-basic-2 실행


풀이

chall2.exe 파일을 x64dbg로 열어보자.

[그림3] rev-basic-2

 

Input에 값을 입력받는 곳으로 가기 위해 계속해서 실행해본다.

Input을 받는 곳의 함수로 들어간 모습은 아래와 같다.

Correct가 출력되기 전에 값을 비교하므로 Correct를 출력하기 직전에 호출되는 함수로 가보겠다.(Call chall2.7FF613071210)

[그림4] rev-basic-2 Input

 

들어가보면 아래와 같은 모습을 볼 수 있는데,

하나하나 잘 봐보자.

 

[그림5] 7FF613071210

1.   mov qword prt ss:[rsp+8], rcx
2.   sub rsp, 18
3.   mov dword prt ss:[rsp], 0
4.   jmp chall2.7FF61307101A
.
.
.
5.   movsxd rax, dword ptr ss:[rsp]
6.   cmp rax, 12
7.   jae chall2.7FF613071048
8.   movsxd rax, dword prt ss:[rsp]
9.   lea rcx, qword prt ds:[7FF613073000]

1. rsp + 8 주소의 값에서 8바이트 주소의 값을 rcx로 바꿔라

2. rsp의 값을 18만큼 감소시킨 다음에 rsp에 저장하라 (스택에 공간을 할당함)

3. rsp 주소의 값에서 4바이트 주소의 값을 0으로 바꿔라

4. chall2.7FF61307101A로 점프해라

5. movsxd를 통해 rsp 주소의 값에서 4바이트 주소의 값을 rax에 저장하라

6. rax의 값을 12랑 비교해라 (현재 rax의 값은 0)

7. 비교한 그 값이 12보다 크거나 같으면 chall2.7FF613071048로 점프해라 (크거나 같지 않을 경우 즉, 작을 경우에는 점프하지 않고 다음 코드 진행)

8. rsp 주소의 값에서 4바이트의 주소의 값을 rax에 저장하라

9. 7FF613073000 값에서 8바이트 주소의 값을 rcx에 저장하라

 

그럼 rcx에 7FF613073000값이 저장되어 있는 것을 확인할 수 있고,

 

메모리를 확인하기 위해서 7FF613073000 주소로 가보자.

가보면 아스키 코드에 Flag 값이 있는 것을 확인해볼 수 있다.

[그림6] 7FF613073000

 

 


답: Comp4re_the_arr4y

'CTF > Reversing' 카테고리의 다른 글

[DreamHack] rev-basic-3 문제 풀이  (0) 2022.02.13
[DreamHack] rev-basic-1 문제 풀이  (0) 2022.02.10
[DreamHack] rev-basic-0 문제 풀이  (0) 2022.02.10

rev-basic-1


문제

문제는 다음과 같다.

[그림1] rev-basic-1 문제

 

해당 파일을 실행해봤을 때 chall0.exe와 동일하게 Input에 올바르지 않은 값을 입력하면 Wrong이 출력된다.

Correct가 출력되도록 올바른 값을 찾기 위해 분석해보자!

[그림2] rev-basic-1 실행


풀이

chall1.exe 파일을 x64dbg로 열어보자.

[그림3] x64dbg rev-basic-1

 

Input을 입력받는 곳으로 가기 위해 계속 실행해본다.

함수를 호출하는 부분에서 멈췄는데 이 함수를 호출해서 값을 입력받고 입력받은 값을 비교하는 것 같으니

correct 바로 직전 Call 함수 안으로 들어가보겠다.

[그림4] rev-basic-1 Input

 

들어가보면 값을 하나씩 비교하는 부분이 나온다. 한 문자씩 특정 문자와 비교해서 올바르면 Correct로, 틀리면 Wrong으로 간다.

[그림5] chall1.7FF71AF41000 함수

그래서 특정 문자들을 총 종합해보면 Compar3_the_ch4ract3r이 나오는 것을 확인할 수 있다.


답: Compar3_the_ch4ract3r

'CTF > Reversing' 카테고리의 다른 글

[DreamHack] rev-basic-3 문제 풀이  (0) 2022.02.13
[DreamHack] rev-basic-2 문제 풀이  (0) 2022.02.13
[DreamHack] rev-basic-0 문제 풀이  (0) 2022.02.10

rev-basic-0


문제

문제는 다음과 같다.

[그림1] rev-basic-0 문제

 

문제를 실행해봤을 때 Input에 값을 입력하니 올바르지 않았는지 Wrong이 출력된다.

올바른 값을 입력했을 때 Correct가 나오기 때문에 우린 그 값을 분석을 통해 알아볼 것이다!

[그림2] rev-basic-0 실행

 


풀이

chall0.exe 파일을 x64dbg로 열어봤다.

(기존에는 OllyDbg를 이용했지만 OllyDbg는 32비트만 지원하고 해당 파일은 64비트이기 때문에 x64dbg를 사용했다.)

[그림3] x64dbg 

 

 

데이터를 입력받는 곳까지 계속 실행해봤다.

데이터를 입력받으면 그 값이 올바른 값인지 비교하고 맞으면 correct를 틀리면 wrong을 출력한다는 것을 확인할 수 있다. 그래서 call chall0.7FF783BF1000에 들어가보았다.

[그림4] cahll0.exe Input

 

 

들어가보면 call <JMP.&strcmp>를 볼 수가 있는데, 이는 두 값을 비교해서 eax에 틀리면 1을 저장하고 (mov dword ptr ss:[rsp+20], 1), 동일하면 0을 저장해서(mov dword ptr ss:[rsp+20], 0) Correct로 점프한다는 것을 알 수 있다.

[그림5] call <JMP & strcmp>

 

 

그래서 Input에 Compar3_the_str1ng을 입력해봤을 때 값을 계속 비교하는 것을 확인할 수 있었고

[그림6] Compar3_the_str1ng 값 비교

 

 

마침내 Correct를 출력하는 것도 확인할 수 있다.

[그림7] Correct 출력

 


: Compar3_the_str1ng

'CTF > Reversing' 카테고리의 다른 글

[DreamHack] rev-basic-3 문제 풀이  (0) 2022.02.13
[DreamHack] rev-basic-2 문제 풀이  (0) 2022.02.13
[DreamHack] rev-basic-1 문제 풀이  (0) 2022.02.10

+ Recent posts