1. 정보수집
[0x100] 파일 종류 검사
- 리눅스 또는 BSD 기반 OS에서 사용되는 실행 파일 형식
- 아키텍처는 i386
- 실행 파일의 심볼 정보가 제거됨
[0x110] 파일에 포함된 문자 검사
[0x120] 파일 실행
- 플래그 형식은 FLAG{...}
- 플래그는 특정 방법으로 암호화돼 있다.
- 암호화된 플래그는 7d 56 18 43 15 67...
- 암호화된 플래그는 16진수
- 문제 파일에는 복호화를 위한 함수가 구현되지 않았다.
- ./SelfReference -encrypt <str> 와 같이 실행
테스트해보기~
- -encrypt라는 문자열을 첫 번째 인수로 지정해 문제 파일을 실행하면 두 번째 인수에 지정한 문자열이 암호화된다.
2. Radare2로 문제 풀기
[0x200] radare2 실행
파일을 분석하려면 aa 명령과 aac 명령을 사용한다.
위와 같이 aa는 결과가 표시되지만 aac는 아무것도 표시되지 않는다. 다음으로 afl 명령으로 읽어들인 파일에서 추출한 함수 목록을 표시한다.
함수를 역어셈블한 결과를 표시하려면 pdf 명령을 사용한다. main 함수를 역어셈블한 결과를 표시한다.
[0x210] 암호화된 함수 식별
- abcd 와 -encrypt를 strcmp로 비교해 두 문자열이 일치한 경우의 경로에 암호화를 수행하는 함수가 위치함
-encrypt라는 문자열이 문제 파일의 어느 주소에 위치하는지 알아본다.
- 0x08048d03 메모리주소에 -encrypt라는 문자열이 위치
- 0x08048d03을 참조하는 주소가 0x804880a 임을 알 수 있음
0x804880a로 이동해 역어셈블한 결과를 살펴본다.
- 0x08048810에서 문자열 비교를 하고
- 실행돼 종료되는 경로를 따라가 보면
- fcn.080486eb
- fcn.08048be1
- fopen 함수를 사용해 문제 파일 자신을 바이너리 읽기 모드로 연다.
- fseek 함수를 사용해 파일 포인터를 가장 뒤에서 0xfffffc00바이트 위치로 이동한다.
- fgets 함수를 사용해 현재 파일 포인터 위치에서 1024바이트를 취득해 calloc 함수에서 확보한 1024바이트 영역에 저장한다.
앞서 확인한 실행 순서를 C 언어로 나타내면 다음과 같다.
#include <stdio.h>
int fcn_080486eb(char *ebp_8, char *ebp_c) {
int local_14h;
FILE *local_10h;
char *local_ch;
local_14h = 1;
if(local_10h = fopen(ebp_c, "rb")) ==0) {
local_14h = 0;
}
if(fseek(local_10h, 0xfffffc00, 2)) != 0) {
local_14h = 0;
}
local_ch = fgets(ebp_8, 0x400, local_10h);
return local_14h;
}
References
'네트워크 보안 > CTF' 카테고리의 다른 글
[Web] webhacking.kr 3번 (0) | 2022.05.27 |
---|---|
[Web] webhacking.kr 1번 (0) | 2022.05.27 |
[HTB/starting-point] Responder (0) | 2022.04.13 |
[VulnHub] Mr.Robot 🤖 (0) | 2022.03.02 |
📖 CTF 정보보안 콘테스트 챌린지북 (네트워크/패킷분석) (0) | 2022.03.02 |