HolyShield CTF write up
Forensic
Leak1
문제를 압축 해제를 하고 vmdk를 문자열 검색을 해보면 아래와 같습니다.
Flag : HS{Y0u_4re_7hE_B3sT_rEpairm4N}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Web
Hidden Board[서버가 닫힘..]
먼저 robots.txt 에 들어가서 관리자 페이지 URL 을 획득한다.
관리자 페이지는 아래와 같습니다.
해당 사이트에 들어가 보면
이런 식의 화면이 출력이 됩니다.
eval 과 f라는 변수에 값이 없다는 에러 문과 file_get_contents 라는 함수가 filename 이 비어있다고 함녀서 Warning 으로 뜹니다.
file_get_contents를 보고 lfi 공격을 할 수가 있습니다.
해당 파일이 있는 경로를 이용해서 소스코드를 leak 할수 있을 것 같습니다.
소스코드를 확인해 보면 아래와 같습니다.
현재 경로가 위와 같기 때문에 일단 admin__admin.php를 leak 하기 위해서 ../../Ym9hcmQ/admin__admin.php 를 확인하기 위해서 base64를 이용하겠습니다.
위와 같이 base64 encoding으로 admin__ admin.php 파일을 확인 했습니다.
base64 decode 사이트를 이용해서 디코딩 해보겠습니다.
위의 코드 외에도 아래에 html 코드가 있었지만 생략하겠습니다.
Filter 함수를 확인해 보면 $filter에 있는 문자열이 들어가야 eval함수가 실행 됩니다.
그래서 아래와 같은 페이로드를 이용해서 flag를 leak 할 수 있습니다.
결과로 아래와 같은 웹 페이지를 출력합니다.
Flag : HS{Eval_make_Many_ANswer!!}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Rev
Easy_Ransome
문제 파일을 열어보면 파일 2개가 눈에 들어옵니다.
해당 문제는 원본 flag 사진을 가지고 Easy_R.exe 파일을 이용해서 인코딩 하면 flag 파일이 나옵니다.
이를 역공학을 이용해서 문제를 해결하면 되는 것 같습니다.
먼저 패킹 유무를 확인해 보겠습니다.
SECTION UPX0 과 SECTION UPX1 을 보면 UPX 패킹이 되었다는 것을 알수 있습니다.
그래서 upx.exe 프로그램으로 unpacking 해보겠습니다.
IDA 32bit 을 이용해서 분석을 해보면 다양한 함수가 나오게 됩니다.
main 함수를 찾아보면 sub_401140이라는 것을 알 수 있습니다.
코드를 분석해보면 1:1 대응으로 xor 과 + 연산을 하는 것으로 보입니다.
1:1 대응으로 xor 하기 때문에 아래와 같은 방식으로 코드를 작성해 보도록 하겠습니다.
먼저 아래와 같은 시트를 하나 만들어 줍니다.
그리고 해당 파일을 Easy_R.exe에 넣어서 대칭 시트를 한번 만들어 보겠습니다.
대칭 시트를 바탕으로 다음과 같은 로직으로 flag 파일을 변환할 예정입니다.
아래의 사진은 flag 파일의 hex 값 입니다.
34 53 34 2B만 직접 변환해 보겠습니다.
34라는 값을 대칭 시트에서 찾아보면 FF 위치에 있습니다.
그러면 FF 라는 값을 대신 넣는 식으로 로직을 작성하면 아래와 같습니다.
34 -> FF
53 -> D8
34 -> FF
2B -> E0
FF D8 FF E0 <- jpg 헤더 시그니처 값입니다.
이런식으로 로직을 작성해서 python 코드를 이용해서 변환해 보겠습니다.
↓ recover_flag.jpg
Flag : HS{EA5Y_RAN50ME_H0Ly}
또다른 풀이 :
IDA를 보고 1:1 대응이다 라는 것을 캐치 하고 아래와 같이 Easy_R.exe 를 실행하면 flag를 출력할 수 있습니다.
연산이 xor 이기 때문에 그대로 주어진 flag를 넣어도 flag를 얻을 수 있습니다.
para
문제에 있는 실행파일을 실행해보면 아래와 같습니다.
a를 입력하니까 1이라는 키 값을 줍니다.
그리고 암호화 값으로 10.0231587704 를 줍니다.
b를 입력해 보면 2라는 키 값을 주고 암호화 값으로 19.6168935354 라는 값을 줍니다.
그렇다면 ab를 입력했을때 어떻게 되는지 보겠습니다.
(1+2)/2 의 값이 key 값이 되는 것으로 판단이 됩니다.
암호화 데이터는 a의 기본 암호화 값 * key 값이 되는 것 같습니다.
일단 a부터 모든 암호화에 사용되는 베이스를 가지고 주어진 flag.txt 파일을 복호화 하면 될것 같습니다.
Flag : HS{1_am_P0S1T1VE_bec4use_1_l0st_Electron}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ