728x90

시험기간이지만 집에 일찍와서 게임 한시간 하는거 보다 힛콘 트레이닝으로 시간을 쓰는게 좋다고 생각이 들어 도전하게 되었다!!

오늘은 첫번째 문제인 LAB 1을 풀어보려고 한다.

풀이


lab1 디렉토리 내용물

lab1 디렉토리에 들어가면 다음과 같이 소스파일과 바이너리를 볼 수 있다. 우선 소스를 읽어보았다.

 

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
#include <stdio.h>
#include <unistd.h>
 
 
 
void get_flag(){
    int fd ;
    int password;
    int magic ;
    char key[] = "Do_you_know_why_my_teammate_Orange_is_so_angry???";
    char cipher[] = {75925211166130981845408910030220485228317190126286210301110746660449149852303316763066};
    fd = open("/dev/urandom",0);
    read(fd,&password,4);
    printf("Give me maigc :");
    scanf("%d",&magic);
    if(password == magic){
        for(int i = 0 ; i < sizeof(cipher) ; i++){
            printf("%c",cipher[i]^key[i]);
        }
    }
}
 
 
int main(){
    setvbuf(stdout,0,2,0);
    get_flag();
    return 0 ;
}
 
 
 
cs

다음과 같은 소스코드를 볼 수 있는데 단순하게 password에 랜덤값을 집어넣고 사용자로 부터 값을 입력 받아 값이 같으면 암호를 복호해 출력시켜준다. 걍 파이썬으로 짜서 돌리면 나오겠지만 이것마저 귀찮으면 GDB를 이용해 풀 수 있다!

코드에서 if로 password 와 magic의 값이 같은지 검사하는 부분이 있는데 이부분에서 eax에 scanf로 부터 받은 값을 넣어주고 edx에는 magic의 값이 들어가게 된다. 그렇다면 검사하는 부분이 참이되도록 edx와 eax의 값을 같게 해주면 된다!!

 

GDB로 해당 바이너리를 열고 주요함수인 get_flag 함수를 살펴보면 get_flag+389 명령어가 cmp edx,eax 인 것을 확인할 수 있다!

cmp edx, eax

그럼 이제 get_flag+389에 break point를 걸어준 후 eax값을 set명령어로 바꿔주고 계속 실행시키면 끝!

요렇게 잘 디버깅 하면서 값을 바꿔준다!!

플래그 뙇

CTF{debugger_1s_so_p0werful_1n_dyn4m1c_4n4lySis!}

컴퓨터를 진짜 오랜만에 해서 그런지 너무너무 재미있다!! ㅎㅎ

'PWN > HITCON_Training' 카테고리의 다른 글

[HITCON_Training] LAB 6  (0) 2019.07.07
[HITCON_Training] LAB 5  (0) 2019.07.07
[HITCON_Training] lab 4  (0) 2019.07.05
[HITCON Training] LAB 3  (0) 2019.07.04
[HITCON Training] LAB 2  (0) 2019.07.04