Shadow CTF write up
Example
Hello
Flag : SHADOW{He11o_W0rld!}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Web
SourceCode
사이트에 들어가 보면 아래와 같습니다.
소스코드를 백업 시켜두는 파일인 index.phps 를 들어가 보면 아래와 같은 코드를 확인 할 수 있습니다.
eval(gzinflate(base64_decode())) 이므로 아래의 사이트 에서 실행을 해보겠습니다.
http://www.tareeinternet.com/scripts/decrypt.php
DQogJGZhbGcgPSAiU0hBRE9Xe1BIUF8zTkMwRDFOR30iOyA= 를 base64로 디코딩을 하면 아래와 같은 Flag 를 얻을 수있습니다.
Flag : SHADOW{PHP_3NC0D1NG}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
MAGIC PASSWORD
사이트에 들어가 보면 아래와 같은 사이트가 나옵니다.
소스코드를 확인해 보면 아래와 같습니다.
v1에는 sha1 magic hash 값을 넣으면 되고 v2에는 md5 magic hash 값을 넣으면 되는데 ctype_alpha함수 때문에 문자 값만 넣을 수 있습니다.
해당 사이트(https://github.com/spaze/hashes) 를 이용해서 문제를 해결하면 아래와 같습니다.
Flag : SHADOW{C0FF33H0L3}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
JavaScript CHALLENGE?!
사이트를 열어보면 문제가 시작 됩니다.
key0 : start
해당 난독화 소스코드를 아래의 사이트에서 난독화 해제를 해보겠습니다.
사이트 : https://www.strictly-software.com/unpack-javascript
key1 : 5T4GE_1
소스코드를 확인하면 아래와 같습니다.
console 창을 열어서 quest(); 를 하면 버튼이 눌릴것 같습니다.
key를 주지만 flag의 부분을 주는것 같습니다.
base64로 디코딩 해보면 아래와 같습니다.
SDNOUzFWM19XM0JfQ0g0 -> H3NS1V3_W3B_CH4
key2 : 5T4GE_2
flag_fragment_2 = H3NS1V3_W3B_CH4
해당 난독화는 아래의 사이트에서 난독화 해제가 가능합니다.
사이트 : https://lelinhtinh.github.io/de4js/
HTML 주석을 확인 하라고 합니다.
key를 찾는 엄청난 게싱을 하였습니다 ㅠㅠ [게싱 너무 시러여 ㅠㅠ]
key3 : C0MM3N7
해당 코드를 뷰티플러로 난독화를 해제해 보겠습니다.
중요한 부분은 이부분입니다.
function()를 반환하는 함수 인것 같습니다.
console에 해당 함수를 실행해 보겠습니다.
아래로 좀 더 내려보면 다음과 같은 문자열이 있습니다.
localStorage라고 해서 key4의 값과 flag_fragment_1 의 값이 들어있습니다.
key4 : 57AG3_A
flag_fragment_1 : U0hBRE9Xe0MwTVBSMw== -> SHADOW{C0MPR3
클릭을 해도 값이 나오지 않습니다.
script.js 를 확인해 보면 아래와 같이 real_show_flag 라는 함수가 있습니다.
console에 show_flag()를 이용해서 히든 Flag 확인이 가능합니다.
key5 : H1DD3N_FL4G
도움말 페이지 참고 라는 문자얄을 출력하는데 처음 들어왔을때 도움말이 있었고, 들어가진 못했습니다.
게싱으로 도움말 페이지가 help.php 라는 것을 알게 되었습니다.
총 3개의 조각으로 flag가 나뉘어져 있는데 이미 2개를 찾았고 나머지 하나를 해당 페이지에 있다고 합니다.
헤더에 숨겨져 있네요!
flag_fragment_3 : TEwzTkczX0cxRlRfUzNUfQ== -> LL3NG3_G1FT_S3T}
Flag : SHADOW{C0MPR3H3NS1V3_W3B_CH4LL3NG3_G1FT_S3T}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Pwnable
mctz-fd
해당 파일을 실행시키면 아래와 같이 나옵니다.
ls를 입력해 보면 실행 파일, 소스코드, flag 가 나옵니다.
소스코드를 확인해 보면 아래와 같이 나오게 됩니다.
./fd 인자값 형식으로 실행을 해야하는데 인자값-0xDEAD 를 fd라는 변수에 넣고, read 함수를 실행 합니다.
일단 우리는 buf 라는 변수에 SHOWMETHEMONEY를 넣어야 하는것 같습니다.
그렇다면 인자값으로 0xDEAD 만큼 넣어 주게 되면 바로 buf 라는 곳에 값을 넣을 수 있게 됩니다.
아래와 같이 실행을 하면 flag 가 출력이 됩니다.
Flag : SHADOW{q1w2e3r4}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Reversing
FindPng
해당 파일을 IDA 로 열어서 main을 확인해 보겠습니다.
heap 할당을 하고 unk_4020F8에 들어있는 값을 heap 할당 받은 v3에 복사하고 그냥 heap 할당 해제를 해버립니다.
그렇다면 unk_4020F8 에 값이 있을 것 같습니다.
들어 있네요!
해당 값을 전부 드래그 해서 Edit -> Export data 를 하시고 hxd로 파일을 제작해서 확인해보면 아래와 같습니다.
Flag : SHADOW{H0w_m@ny_hambUrgErs_c@n_I_have?}
또다른 방법 :
해당 파일을 foremost 카빙 툴로 추출해보면 아래와 같습니다.
output에 나온 사진을 보면 flag를 찾을 수 있습니다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
RSP_GAME
문제 파일을 열어보면 가위바위 보를 하는데 총 100번을 합니다.
상대가 내는 가위바위보의 로직을 이해하지 못해서 JMP 구문으로 풀이 하겠습니다.
올리디버거로 해당 파일을 열어보면 아래와 같습니다.
해당 로직 이 돌아가는 부분입니다.
일단 00E01217에 가서 입력을 해보겠습니다.
[s 가 Success를 띄우는 값 이기 때문에 s를 넣었습니다.]
저 부분이 입력값에 따라서 성공과 실패로 보내는 JE 구문 입니다.
일단 성공 문자열이 어디서 뜨는지 확인 해보겠습니다.
00E0128A 를 지나니까 성공이라고 문자열을 띄웠습니다.
위의 JE 부분의 주소를 전부 00E0128A로 만들면 전부 성공을 띄울것 같습니다.
F9로 실행을 해보면..
100번 입력하면 FLAG를 줍니다.!
Flag : SHADOW{ShaDow_Is_Best>_<}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Misc
xor
해당 파일을 다운 받아 보면 사진 파일이 들어있고, 어떠한 값이 적혀 있습니다.
윗줄 아래줄 앞부분을 hex값을 문자열로 바꿔보면..
Machhne Language :
Flag :
를 의미합니다.
윗줄은 기계어를 의미하는것 같고
아래줄은 flag 를 의미 하는것 같습니다.
기계어를 분석해 보겠습니다.
올리디버거에 Ctrl+E로 위의 값을 전부 적어보면 어셈으로 코드를 확인 할 수 있습니다.
값을 255와 XOR 한다는 어셈 코드 입니다.
아래의 FLAG 를 255와 XOR 를 해보면 아래와 같습니다.
Flag : SHADOW{he10W_w0r1D}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ