해보자고

[리버싱] rev-basic-4 본문

리버싱

[리버싱] rev-basic-4

초코맛동산 2024. 4. 28. 20:42

# 문제

https://dreamhack.io/wargame/challenges/18

 

rev-basic-4

Reversing Basic Challenge #4 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출

dreamhack.io

이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!

 


1. main 함수 찾기

 

basic 단계라 쉽게 main 함수를 발견할 수 있다. (main 함수 찾는 법은 이전 글들 참고)

 

 

 

2. 실행 흐름 파악하기

 

rev-basic 시리즈들과 마찬가지로 test eax eax로 eax값이 0인지 확인하고, 0이면 jz(=je) 명령어로 인해 wrong이 출력되고, 0이 아닌 값이면 correct가 출력된다.

 

 

중요한 분기점이 되는 함수는 test 이전에 불려진 cha113.7FF6D3C61000임으로 살펴본다. (IDA는 sub_140001000)

 

 

 

3. 디버깅

IDA와 함께 살펴보면 디컴파일 기능으로 인해 xdbg보다 쉽게 해당 함수의 기능을 살펴볼 수 있다. 

 

sub_140001000의 내용인데 해당 함수는 인자로 a1을 받고 있고, 해당 인자와 byte_140003000[i]를 28번 비교하는 것을 확인할 수 있다. 해당 비교에 대한 결과 값이 같지 않으면 0(wrong), 같으면 1(correct) 이기에 같게 만들어 주는 값이 flag임을 쉽게 알 수 있다. 

 

a1이 어떤 인자일까?? 바로 input으로 받은 우리의 입력값이다. 

같아야 하는 byte_140003000의 문자열을 28개까지 살펴보면 내용은 아래와 같다. 

 

 

3.1 연산의 결과

해당 연산을 하나 하나 해볼 필요는 없지만 그래도 한 번 연산을 나의 입력값에 대입해서 확인해보았다.

나의 INPUT: ULALA

 

<U>

1) 16 * a1[0]

16 * 85(U의 아스키 값) = 1360(010101010000)

1360을 unsigned__int8 로 캐스팅 -> 01010000

 

2) a1[0] >> 4

85(U의 아스키 값, 01010101 ) >> 4 = 00000101

 

3) 01010000 | 00000101 = 01010101

 

<L>

1) 16 * a1[1]

16 * 76(L의 아스키 값) = 1216(11000000) 

 

2) a1[1] >> 4

76(L의 아스키 값, 01001100 ) >> 4 = 4(00000100)

 

3) 11000000 | 00000100 = 11000100

 

=> 상위 4비트와 하위 4비트를 바꾼 결과 값을 해당 연산을 통해 새로 생성하고 있다. 

 

 

 

4. 마무리 코딩 작업

#include<stdio.h>

int main() {

    int input[28] = {0x24, 0x27, 0x13, 0xC6, 0xC6, 0x13, 0x16, 0xE6, 0x47, 0xF5, 0x26, 0x96, 0x47, 0xF5, 0x46, 0x27,   
    0x13, 0x26, 0x26, 0xC6, 0x56, 0xF5, 0xC3, 0xC3, 0xF5, 0xE3, 0xE3, 0x00};  

    int flag[28] = {0};

    for(int i = 0; i < 28; i++) {
        flag[i] = 16 * input[i] | input[i] >> 4;
    }

    printf("flag is ");

    for(int i = 0; i < 28; i++) 
    printf("%c", flag[i]);

    return 0;

}

 

 

'리버싱' 카테고리의 다른 글

[드림핵] simple-operation  (0) 2024.05.13
[드림핵] rev-basic-6  (0) 2024.05.06
[드림핵]rev-basic-3  (0) 2024.04.27
[드림핵]rev-basic-2  (0) 2024.04.27
[크랙미 ] crackme1  (1) 2024.04.21