[ Pwnable ]
01. 내 버퍼가 흘러넘친다!
prob1파일 ghidra로 디컴파일
main 함수 내에 name이라는 변수가 없는 것을 확인.
저기서 name을 더블클릭하여 name함수 찾아냄
0x084a060위치에 name이 초기화되지 않은 채로 있는 것 확인.
stack 구조
dummy로 채울 값 24byte+ return주소에 name 주소 채운다.
checksec로 NX꺼져있는 것 확인 - shellcode 삽입 가능
다른 문제에서는 버퍼오버 플로우를 유발하여 cmd /bin/sh 같이 쉘기능을 하는 명령어쪽으로 유도되게 했으나, 이 코드에는 /bin/sh 같은 코드가 없다.
따라서 이 name주소에서 /bin/sh가 실행되게 쉘코드를 넣어준다.
http://shell-storm.org/shellcode/files/shellcode-827.php
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
이런 식으로 쉘을 실행하는 코드를 찾아 입력
다음과 같이 python코드를 작성.
name에 shellcode 넣고 return 주소를 name으로 버퍼오버플로우하여 삽입되도록한다.
*python3으로 실행하기 때문에 sendline시 byte로 전송되게끔 하기 때문에 b’A’로 적는다.
Flag: HackCTF{1_l0v3_70p_pwn3r_m4lhyuk}
02. Simple_Overflow_ver_2 (Pwnable)
문제 확인 및 문제 페이지 접속
실행권한 부여 후 실행
주어진 파일을 실행하니 Data를 입력하라는 창이 출력되었고, 무작위 데이터를 입력하니 메모리 주소와 입력된 값이 출력되는 과정을 반복하고 있음을 알게 됨
흐름을 파악하면, 입력값이 저장된 메모리의 주소와 메모리에 저장된 입력값을 16글자씩 출력하는 과정을 반복하고, 반복이 종료되면 “Again (y/n)”으로 다시 실행할지 여부를 묻고 있었음
이때 사용자의 값을 입력받는 함수는 취약한 함수로 알려진 scanf로, 만약 메모리 보호 기법이 적용되어 있지 않다면 쉘 코드 삽입이 가능할 것으로 예상함
우선 문제의 제목처럼 버퍼 오버플로우가 가능한지 살펴보기 위해 문제에서 제공한 프로그램의 보호기법을 살펴봄
NX가 꺼져 있어 쉘 코드 삽입이 가능한 것을 확인할 수 있음
(NX Bit: 프로세서 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술, NX 특성으로 지정된 모든 메모리 구역은 데이터 저장을 위해서만 사용되며, 프로세서 명령어가 그 곳에 상주하지 않음으로써 실행되지 않도록 만들어 줌 (위키백과))
성공적인 쉘 코드 삽입을 위해서는 사용자가 데이터를 입력하는 부분에 “쉘 코드 + Dummy + 쉘 코드 저장 주소”를 입력해야 함
이를 위해서는 리턴 주소가 무엇이고 리턴 주소가 사용자의 입력값이 저장된 위치로부터 얼마나 떨어진 곳인지 알아야 함
이에 gdb에서 ret과 scanf에 BP를 걸고 리턴 주소와 메모리를 살펴봄
scanf로 값을 입력한 직후, 입력값이 저장된 ebp-0x88과 그 이후 값을 살펴보니 아래와 같았음
(x/gx: 8바이트 단위로 메모리 확인 (64비트 환경))
이후 ret 명령 실행 시 설정된 리턴 주소를 아래와 같이 살펴봄, 리턴 주소는 0xffffd12c였음
아까 살펴봤던 ebp-0x88의 주소는 0xffffd0a0이었으므로, 리턴 주소는 사용자의 입력값으로부터 0x8c(10진수 140)만큼 떨어졌다는 것을 알 수 있음
이제 문제를 해결하기 위해서는 “쉘 코드 + Dummy값 140 + ret 부분에 ebp-0x88의 주소”를 삽입하면 exploit이 가능할 것으로 예상됨, 하지만 몇 번의 실험 결과 ret 주소는 매번 바뀌기 때문에 그 값을 프로그램 실행 시 받아와야 함을 알게 됨, 이에 아래와 같은 코드를 작성함
먼저 문제 페이지에 접속, “Data : “ 문자열이 나올 때까지 데이터를 받고, 입력 값으로 무작위 값을 전달함 (p.senline)
다음으로 메모리의 주소 값을 16진수로 10글자 받아오고 이를 int형으로 변환함, 데이터 확인을 위해 메모리의 주소값을 출력하도록 함
이후 다시 “Again (y/n)” 문자열까지 데이터를 받고, 입력 값으로 “y”를 전달함
다시 반복되는 “Data : “ 문자열까지 데이터를 받아오고 이번에는 무작위 값 대신 payload에 쉘 코드(31바이트) + Dummy(109바이트) + 32비트 리틀 엔디안 방식으로 패킹한 ret에 저장할 쉘 코드 주소를 보냄
그 결과는 아래와 같이 성공적으로 exploit됨
이후 ls로 파일을 확인, flag 값을 얻어냄
Flag: HackCTF{y0u_d1d_7h3_45516nm3n7_5ucc355fully!}
03. j0n9hyun's secret
메인 함수 내용.
파일을 실행하면 input name :
이라는 값을 입력할 수 있다.
name을 입력할때 f를 덮어 씌워서 3으로 만들면 flag가 읽힌다.
0x6cce98 - 0x6ccd60 = 0x138 즉 아무 문자 0x138개를 입력을 하면 fd를 침범해서 쓸 수 있고, 이것을 3으로만 바꾸어 주면 top_secret을 읽을 수 있다.
푸는 데 필요한 라이브러리
- pwntools
- pathlib2
포너블할 수 있는 툴 다운로드
python3 으로 실행하자 불가 >> pwntools는 python2버전에서만 사용 가능
python2 로 실행하자 불가 >> pathlib2 라는 것을 다운로드 해야 함
python-pathlib2 다운로드
python2로 파일 실행하자 플래그 확인
Flag: HackCTF{ez_fd_0v4rwr1t4}
[ Cryptography ]
04. Great Binary
문제에서 주어진 파일을 다운로드 받아 압축을 해제한다. hoooo 폴더에는 hoooo.txt 파일이 하나 있다.
hoooo.txt 를 살펴보면 다음과 같이 이진수로 된 파일이 나온다.
이진수-텍스트 변환기를 이용하여 변환했더니 flag 값이 나온다.
Flag : HackCTF{crypto_v2ry_easy_pr0b1em}
05. Smooth CipherText
문제를 클릭하면 다음과 같이 텍스트가 주어진다. 뜻을 알 수 없는 것으로 보아 이 암호문을 해독해야 할 것 같다.
다양한 암호들에 대해 알아보았다. 다른 암호의 경우에는 일대일 대응이라는 조건에 주어진 텍스트가 부합하지 않아 비즈네르, 카이사르 두 암호로 디코딩 해보았다.
Hellooooooooo Everyone! Do you know Who am I? my name is smoothman uh...I know very well what you want! If you can decipher this cryptogram, you can get the correct answer. so, flag is HackCTF{v_jvyy_3rzrz0r3_lbh.qba'g_sbetrg_zr_gbb}
비즈네르 변환기로 변환한 결과 다음과 같은 결과를 얻을 수 있었다.
위에서 얻은 flag 값 (HackCTF{v_jvyy_3rzrz0r3_lbh.qba'g_sbetrg_zr_gbb} )이 오답으로 나온다. Flag 문자열은 다시 한번 디코딩이 필요해보인다.
다시 디코딩을 진행하면 다음과 같은 flag 값을 확인할 수 있다.
Flag : HackCTF{i_will_3emem0e3_you.don't_forget_me_too}
[ Misc ]
06. Baseball Price (Misc)
문제 확인 및 문제 페이지 접속
문제에서는 야구배트와 야구볼의 가격을 묻고 있었음
야구볼의 가격을 x, 야구배트의 가격을 x+1이라고 한다면 아래와 같은 수식을 통해 x의 값을 구할 수 있음
x + (x + 1) = 1.10
2x + 1 = 1.10
2x = 0.10
x = 0.05
즉, 야구볼의 가격은 0.05$, 야구배트의 가격은 1.05$로 문제의 조건을 모두 만족하게 됨, 이에 정답을 입력창에 입력함, 그 결과 아래와 같이 flag가 출력됨
flag: HackCTF{말랑말랑_두뇌교실}
07. BF
brain fuck이라는 난해한 프로그래밍 언어이다.
https://ko.wikipedia.org/wiki/%EB%B8%8C%EB%A0%88%EC%9D%B8%ED%8D%BD에서 보고 직접 해독하여 풀이가 가능하긴 하지만 decoder가 있으니 디코더를 써준다.
아무 디코더나 상관은 없어서 이걸로 해독했다.
https://www.dcode.fr/brainfuck-language
flag: HackCTF{1'm_think1n6_4b0ut_th3_vuln3r4b1l1ty_4b1l1ty_4n4ly515_pr0j3ct}
08. QRCODE
zip파일 다운로드
압축을 풀자, 다음과 같은 QR코드 확인됨
이를 인식해 보니까
아무것도 확인되지 않음
그림판으로 사각형을 다시 채워줌
그리고 다시 인식
플래그가 확인됨
플래그를 입력하고 제출
풀이 완료
Flag: HackCTF{1t_w4s_4_g00d_1de4_t0_1nv3r5e}
'4-7. 2021-2 심화 스터디 > CTF' 카테고리의 다른 글
[2021.11.13] dreamhack, HackCTF 풀이 (0) | 2021.11.13 |
---|---|
[2021.11.06] dreamhack, HackCTF reversing, CTF문제풀이 (0) | 2021.11.06 |
[2021.09.25] HackCTF풀이 (0) | 2021.10.08 |
[2021.09.18] Dreamhack rev-basic 외 풀이 (0) | 2021.09.18 |
[2021.09.11]Web, pwnable 개념 정리 (0) | 2021.09.11 |