일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Wargame
- Over The Wire
- write up
- root me
- burp suite
- WebHacking
- 코딩
- web-server
- 개발자
- 웹개발
- 테크트렌드
- 프로그래밍
- Bandit
- 정보보안
- 사이버보안
- pythonprogramming
- hackthissite
- webhacking.kr
- lord of sqlinjection
- sql injection bypass
- 인공지능
- system hacking
- overthewire
- 웹해킹
- geminipro
- XSS GAME
- CTF
- 웹해킹 기초
- web hacking
- SQL Injection
- Today
- Total
컴맹에서 컴공 그리고 화이트 해커가 되는 그날까지
pwnable.kr [fd] write up 본문
칼리 리눅스를 사용해서 pwnable.kr [fd] 문제를 풀어보았다.
우선 접속 정보를 바탕으로
ssh fd@pwnable.kr -p2222으로 들어가 pw인 guest를 입력하여 문제로 접속하였고 ls를 눌러 파일들을 살펴보니
fd fd.c flag 이렇게 3개가 있었다.
당연히 cat flag를 입력해도 flag를 읽을 권한이 없었다.. ㅎㅎ
그래서 cat fd.c를 입력하여 코드를 살펴 보았다.
하지만 보다 보기 편하게 write up을 작성하기 위해 vi를 사용해서 화면을 캡처하였다.
코드는 생각보다 간단하게 작성되어 있었다.
코드를 분석해 보면
char buf[32]; - 32바이트 크기의 문자 배열 buf를 선언하였고
if(argc < 2) { - 프로그램이 실행될 때 전달된 명령줄 인수의 수를 확인합니다. 만약 인수의 수가 2보다 적다면 (프로그램 이름만 전달된 경우), 다음 메시지를 출력하고 프로그램을 종료합니다.
int fd = atoi(argv[1]) - 0x1234; - 명령줄 인수 argv[1]을 정수로 변환하여 (atoi 함수를 사용),
0x1234를 뺀 값을 fd 변수에 저장합니다. 이렇게 계산된 값은 파일 디스크립터를 나타냅니다.
int len = 0; - len 변수를 초기화합니다.
len = read(fd, buf, 32); - 파일 디스크립터 fd로부터 최대 32바이트 데이터를 읽어와 buf 배열에 저장합니다. read 함수는 실제로 읽은 바이트 수를 len 변수에 반환합니다.
if(!strcmp("LETMEWIN\n", buf)) { - buf 배열에 저장된 데이터와 "LETMEWIN\n" 문자열을 비교합니다.
만약 이 두 문자열이 일치한다면 아래의 블록을 실행합니다.
즉 우리는 fd값을 0으로 만들고 LETMEWIN을 입력하여 조건문을 만족시켜 system("/bin/cat flag");를
실행시켜 flag를 읽어야 하는 문제이다.
따라서 16진수 0x1234를 10진수 int로 바꾸면 4,660이므로
이렇게 하면 flag값이 나온다.
그리고 이건 write up과 상관없는 이야기지만 'LS'를 입력하면
이렇게 기차가 지나가는 모습을 볼 수 있다. ㅎㅎ
'해킹 > System hacking' 카테고리의 다른 글
🔍 C 언어 포인터와 메모리 보안: 실전 가이드 (0) | 2025.02.19 |
---|---|
pwnable.kr [bof] write up (11) | 2024.09.16 |
pwnable.kr [collision] write up (0) | 2023.09.10 |