본문 바로가기

5. 방학 활동/Write UP

[2023.07.30] 워게임 문제풀이(2) - 3

목차

  • 포렌식
  • 리버싱
  • 웹해킹

 

포렌식

  • xcz.kr - Prob35
  • xcz.kr - Prob36

문제 1 : xcz.kr - Prob35

👾 해커그룹 'XCZ' 에서는 데이터를 전송할 때 파일이 외부로 유출되더라도 볼 수 없게 숨겨놨다고 한다.
아래의 파일에서 숨겨져 있는 파일을 찾아라.
HINT 1 : RAR 패스워드 브루트포싱 문제가 아닙니다.

 

먼저 문제를 다운로드한다.

 

 

문제에서 다운받은 format_it.zip 파일의 압축을 풀어봤는데, ‘flag.rar’은 다운로드에 성공했으나 어떤 파일 하나는 압축 풀기에 실패했다.

→ 압축 파일 안에 원래 두 개의 파일이 존재하는 것을 알 수 있다.

 

두 개의 파일이 존재하기 때문에, local header 2개, central header 2개, footer 1개가 있어야 한다.

  • local header의 hex 값 : 50 4B 03 04
  • central header 의 hex 값 : 50 4B 01 02
  • footer의 hex 값 : 50 4B 05 06

 

50 4B 03 04

→ local header 1 (정체 모를 파일)

 

50 4B 03 04

→ local header 2 (flag.rar)

 

50 4B 01 02

→ central header 2 (flag.rar)

 

40 4B 05 06

→ footer

 

central header 1의 hex 값이 존재하지 않는 것을 확인할 수 있다. 그래서 파일 압축 풀기에 실패한 것으로 추정된다. central header 1 값을 넣어주면 압축 파일이 완성될 것 같다.

 

central header 1을 채우기 위해 먼저 local header 1을 살펴보겠다.

 

local header 1

local header 1을 분석해보자.

  • Signature: 50 4B 01 02
  • Version: 14 00
  • need.ver: 14 00
  • Bit Flags: 00 00
  • 압축 방식: 08 00
  • 수정 시간: D2 BE
  • 수정 날짜: 50 43
  • CRC: EC BD 08 97
  • 압축 크기: 71 05 00 00
  • 원본 크기: 76 05 00 00
  • 파일 이름 길이: 09 00
  • 추가 필드 길이: 08 00
  • 파일 코멘트 길이: 00 00
  • 디스크 번호 시작: 00 00
  • 파일 속성: 01 00 20 00 00 00
  • 로컬 헤더 offset: 00 00 00 00
  • 파일명: 00 00 00 00 00 00 00 00 00

참고 : https://bing-su-b.tistory.com/81

 

위에 local header 1을 바탕으로 central header 1 내용을 채워보자.

 

  • Signature: 50 4B 01 02
  • Version: 14 00
  • need.ver: 14 00
  • Bit Flags: 00 00
  • 압축 방식: 08 00
  • 수정 시간: D2 BE
  • 수정 날짜: 50 43
  • CRC: EC BD 08 97
  • 압축 크기: 71 05 00 00
  • 원본 크기: 76 05 00 00
  • 파일 이름 길이: 09 00
  • 추가 필드 길이: 08 00
  • 파일 코멘트 길이: 00 00
  • 디스크 번호 시작: 00 00
  • 파일 속성: 01 00 20 00 00 00
  • 로컬 헤더 offset: 00 00 00 00
  • 파일명: 00 00 00 00 00 00 00 00 00

참고 : https://bing-su-b.tistory.com/81

 

central header 2 위에 central header 1 추가

504B01021400140000000800D2BE5043ECBD08977105000076050000090008000000000001002000000000000000000000000000000000

 

수정한 압축 파일 안에 못 보던 파일이 생겼다. 그러나 압축 파일을 풀어도 여전히 저 정체 모를 파일은 생성되지 않는다. FTK Imager를 이용해보겠다.

 

비밀번호가 나타났다.

 

이 비밀번호로 잠금이 걸려있던 flag.rar을 푼다.

 

풀었더니 png 파일이 등장했다.

 

flag : z1p_1t_f0rmat_1t

 

 

문제 2 : xcz.kr - Prob36

👾 피시방에서 아동 청소년 보호법에 위배되는 파일을 소지한 기록을 발견했다.
아래의 형식에 맞춰 증거를 수집해라.
시간은 GMT+9 입니다. lowercase(md5(원본 경로_만들어진 시간_마지막 실행 된 시간_쓰인 시간_볼륨 시리얼))
ex)lowercase(md5(C:\XCZ\key.txt_20121021160000_20131022000000_20131022000000_AAAA-BBBB))

 

먼저 다운받은 파일을 FTK Imager로 열어본다.

 

파일이 많다.

그중 Recent 폴더 안에 ‘s3cr7.avi.lnk’가 있는데 아동 청소년 보호법에 위배되는 파일처럼 보인다. 

 

원본 경로_만들어진 시간_마지막 실행 된 시간_쓰인 시간_볼륨 시리얼을 찾기 위해 010 Editor를 이용하겠다.

 

원본 경로 LocalBasePath H:\study\s3c3r7.avi  
만들어진 시간 CreationTime 10/16/2013 04:52:10 UTC 10/16/2013 13:52:10
마지막 실행된 시간 AccessTime 10/16/2013 14:24:50 UTC 10/16/2013 23:24:50
쓰인 시간 WriteTime 10/16/2013 10:37:47 UTC 10/16/2013 19:37:47
볼륨 시리얼 DriveSerialNumber 3500671657 D0A8-02A9

 

  • UTC = GMT, 따라서 +9시간 해줬다.
  • 볼륨 시리얼 넘버는 대상 파일의 위치 앞에 있는 10 hex 값 앞의 4바이트이다.이때 리틀 엔디안 방식으로 저장되어 있기 때문에, D0부터 읽어주어야 한다.

H:\study\s3c3r7.avi_20131016135210_20131016232450_20131016193747_D0A8-02A9

→ MD5 해시값 : 66f67cd42c58763fd8d58eed6b5bfdba

 

flag : 66f67cd42c58763fd8d58eed6b5bfdba

 

리버싱

  • Dreamhack : rev-basic-1 풀이
  • Dreamhack : rev-basic-2 풀이

문제 1 : Dreamhack : rev-basic-1 풀이

 

rev-basic-1 문제는 “Correct” 문자열을 출력하는 입력 값을 알아내면 된다.

 

처음 프로그램을 실행하면 Input에 값을 입력하도록 되어있고, “Wrong” 문자열이 출력된다.

 

x64dbg를 이용해 코드를 확인해보면, [00007FF7C48E173F] 주소에서 “Input :” 문자열이 출력되는 것을 확인할 수 있다.

rev-basic-0 문제처럼 [chall1.7FF7C48E1350] 주소에 “Correct”와 “Wrong” 문자열 또한 같이 존재할 것 같다.

 

[00007FF7C48E1350] 주소의 모습이다. “Input :”, “Correct”, “Wrong” 문자열이 존재한다.

 

[00007FF7C48E13A3] 주소에서 두 문자열을 비교하므로 [chall1.7FF7C48E1000] 주소에 “Correct”를 출력하는 문자열이 있을 것이다.

 

[00007FF7C48E1000] 주소의 모습이다. cmp 명령어를 통해 문자열을 비교한 뒤, 문자열을 검증하는 것을 볼 수 있다.

 

첫 번째 문자의 경우, eax와 43을 비교한다. 이때, 43은 16진수이므로 10진수로 이를 변환하면 “C”가 된다. 다른 문자 또한 cmp 명령어로 비교하는 16진수 값을 10진수로 변환하면 얻을 수 있다.

 

문자열을 모두 변환하면, flag 값을 얻을 수 있다. 이를 입력하면 “Correct” 문자열이 성공적으로 출력된다.

 

문제 2 : Dreamhack : rev-basic-2 풀이

rev-basic-2 문제는 “Correct” 문자열을 출력하는 입력 값을 알아내면 된다.

 

처음 프로그램을 실행하면 Input에 값을 입력하도록 되어있고, “Wrong” 문자열이 출력된다.

 

x64dbg를 이용해 코드를 확인해보면, [00007FF686D1150F] 주소에서 “Input :” 문자열이 출력되는 것을 확인할 수 있다.

rev-basic-1 문제처럼 [chall2.7FF686D11120] 주소에 “Correct”와 “Wrong” 문자열 또한 같이 존재할 것 같다.

 

[00007FF686D11120] 주소의 모습이다. “Input :”, “Correct”, “Wrong” 문자열이 존재한다.

 

[00007FF686D11173] 주소에서 두 문자열을 비교하므로 [chall2.7FF686D11000] 주소에 “Correct”를 출력하는 문자열이 있을 것이다.

 

[00007FF686D11000] 주소의 모습이다. rev-basic-0과 rev-basic-1 문제와 달리 화면에 문자열이 보이지 않는다. 코드를 확인해봐야 할 것 같다.

 

코드를 확인해보면 rax랑 12를 비교하는 것을 알 수 있다. 12번 반복하면서 문자열을 비교하는 것 같다. 그 후, 두 번째 cmp 명령어에서 [rcx+rax*4]의 값과 edx를 비교하는 것을 볼 수 있다.

 

 

때문에, rcx에 저장된 값을 봐야할 것 같다. [7FF686D13000] 주소에서 rcx에 값을 저장하는 것을 볼 수 있다.

 

[7FF686D13000] 주소에 저장된 값을 보니 flag 값으로 예측된다.

 

해당 문자열을 입력하니 “Correct” 문자열이 성공적으로 출력된다.

 

웹해킹

  • LORD OF SQLINJECTION사이트의 gremlin문제

sql injection에 관한 문제를 다루는 사이트로 첫 번째 페이지를 해결해야 그 다음 페이지로 넘어갈 수 있다.

1. 문제 살펴보기

query문이 제공되어 있는 것으로 보아 id 와 pw가 둘다 참이 되게 하는 쿼리문을 만들면 문제가 풀릴 것이다.

 

2. 문제 분석하기

  • 위 소스코드에서 중요한 부분인 조건문과 그 밑의 query문을 살펴보자
  • if(preg_match('/prob|_|\\.|\\(\\)/i', $*GET[id])) exit("No Hack ~*~");
  • 조건문에 preg_match라는 함수가 있는데 이 함수는 특정한 문자를 필터링할 때 사용한다. 이 함수는 특정 문자를 검색하고 결과가 있을 시 1을, 없을 시 0을 반환한다.
  • preg_match함수는 특수문자 _, ., (, )를 필터링 하고 있으며 뒤에 적힌 /i는 대소문자를 구분하지 않는다는 뜻이다. 즉, id 파라미터에서 필터링하는 것이다. 필터링이 되면 exit되는 규칙이 적용된다.

 

  • 두 번째 조건문의 경우에도 첫 번째 조건문과 마찬가지로 필터링 하는 것을 확인할 수 있다. 두 번째 줄은 pw 파라미터에서 필터링하는 것이다.

 

  • $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; 해당 쿼리문은 id와 pw 둘 중 하나를 참으로 만들어주면 해당 쿼리문을 우회할 수 있다.

 

3. 문제 해결하기

  • 해당 문제는 WHERE 절 뒷부분을 True로 만들어 조건을 충족시켜주면 풀리는 문제이다.
  • "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'”
  • if($result['id']) solve("gremlin"); id만 찾아내면 문제가 풀리기 때문에 우선 id를 admin으로 두고 pw를 무조건 참이 되도록 입력하는 쿼리를 작성하였다.
  • 따라서, id=admin ,pw=’1’ or ‘1’ = ‘1’와 같이 작성하였다. 둘 중 하나가 참이면 모두 참인 or의 특징을 이용하였다.

  • url에 직접 값을 붙여줄 때는 url encoding을 거친다. 위의 사진에서 url뒤에 붙은 %20, %27은 url encoding을 거친 과정이다.