시험기간이지만 집에 일찍와서 게임 한시간 하는거 보다 힛콘 트레이닝으로 시간을 쓰는게 좋다고 생각이 들어 도전하게 되었다!!
오늘은 첫번째 문제인 LAB 1을 풀어보려고 한다.
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[] = {7, 59, 25, 2, 11, 16, 61, 30, 9, 8, 18, 45, 40, 89, 10, 0, 30, 22, 0, 4, 85, 22, 8, 31, 7, 1, 9, 0, 126, 28, 62, 10, 30, 11, 107, 4, 66, 60, 44, 91, 49, 85, 2, 30, 33, 16, 76, 30, 66};
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
인 것을 확인할 수 있다!
그럼 이제 get_flag+389에 break point를 걸어준 후 eax
값을 set명령어로 바꿔주고 계속 실행시키면 끝!
요렇게 잘 디버깅 하면서 값을 바꿔준다!!
CTF{debugger_1s_so_p0werful_1n_dyn4m1c_4n4lySis!}
컴퓨터를 진짜 오랜만에 해서 그런지 너무너무 재미있다!! ㅎㅎ
[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 |