[ Pwnable ]
- bof_basic#2 - 100 points
실행시키고 임의의 입력값(Hi)을 넣으면 다음과 같은 메시지가 생김
checksec을 통해 보호 기법을 확인
Nx를 보니 활성화 되어있다는 것을 확인(shell 실행 불가)
IDA를 이용해 보게 되면(pro)
사용하지못하는 Shell에 대한 함수가 있는 것을 볼 수 있음(shell은 return system(“bin/dash”))를 하고 shell을 대신 하는 함수임
시작 주소는 0x804849B
그리고 메인함수를 보게 되면
v5는 sup 함수 주소 값이 들어가고
s는 fgets 함수에 의해서 133바이트 입력받음
그리고 마지막에 v5를 실행 ( sup 함수를 실행)
sup은 s를 출력(아까 입력값을 넣었을 때 나온 문자 :하아...)
즉 이것을 봤을 때 v5가 가리키는 sup 함수 대신에 shell 함수를 실행시켜
관리자 권한을 통해 플래그 값을 얻어야한다.
보면 s는 ebp로부터 0x8c 떨어져있다(140바이트)
v5은 ebp로부터 0xc 떨어져있음 (12바이트)
두사이는 128바이트 차이남
A*128 (쉘함수를 실행시키기 위해 A에 값을 채워넣어함)+ shell 함수 주소
이를 이용하여 문제를 풀음
파이썬(오류나서 외부 코드 참조-https://dypar-study.tistory.com/33)
파이썬실행후 flag 값 확인
flag: HackCTF{h3y_dud3_600d_f0r_y0u}
[ Reversing ]
02. Reversing Me - 100 points
문제에서 주어진 코드를 살펴보면 위와 같았음
코드를 분석하면 입력한 키가 enter 배열에 저장되고, serial 문자열의 길이와 enter 배열의 길이가 같을 때 enter 배열의 길이만큼 어떠한 비교 연산을 모두 수행하면 “정답일세!” 메시지가 출력되는 것을 짐작할 수 있음
반복문의 조건은 ‘i가 serial의 길이보다는 작으면서 동시에 enter의 i번째 값과 i % 2의 결과값을 xor 연산하였을 때의 값이 serial의 i번째 값과 같음’이라는 것을 알아냄
즉, i % 2가 0인 홀수 번째 자리에 위치한 문자들은 0과 xor 연산해도 그대로이지만, i % 2가 1인 짝수 번째 자리에 위치한 문자들은 모두 1로 xor 연산되었음을 알 수 있음
따라서 문제 해결을 위해 아래와 같은 코드를 작성함
위 코드는 serial 문자열에 수행했던 xor을 다시 xor하는 코드임
(xor 연산은 같은 값을 xor하면 다시 원래의 값이 된다는 성질을 이용함)
코드 실행 결과는 아래와 같음
flag: HackCTF{hey_success_D0_y0u_kn0w_r3verse_3n9ineer1n9?}
[ Web ]
03. 보물 - 100point
1. 첫 화면은 이렇게 구성되어있다.
2. 하단의 Page1, Page2, Page3 버튼을 클릭해보면 url이 변경되는 것을 확인했다. Page1 버튼을 눌렀을 때 기존의 url 뒤에 /?page=1이 추가되는 것을 볼 수 있다. 각 페이지는 /?page=(숫자)와 같은 방식으로 접근할 수 있는 것으로 보인다.
3. 1~10 page를 url을 수정해가며 직접 접근해보았지만 flag를 찾을 수 없었다. 다음 사진처럼 쓰레기값만 출력이 된다.
4. 파이썬 코드를 이용하여 page 0부터 10000까지 접근해보려고 한다. 코드는 다음과 같다. ‘/?page=’ 뒤에 0부터 10000값을 대입해가며 페이지에 접근하고, 그 페이지에 “HackCTF”라는 텍스트가 있으면 반복문을 종료하고 그 page를 출력한다. “HackCTF” 가 없으면 ‘Not (숫자)’를 출력하도록 했다.
5. 다음 코드를 실행하여 다음과 같은 결과를 얻을 수 있었다. 1225 page에 flag값이 존재하는 것으로 추정된다.
6. 기존의 url에 /?page=1225를 추가하여 1225 page에 접근해보았다.
7. 다음과 같이 flag 값을 확인 할 수 있다.
flag: HackCTF{0hhhhh_5o_g0od_try!}
04. guess me - 100 point
아무 값이나 입력하고 제출.
위에서 guess 파라미터가 추가되어 나오는 것을 확인
php 소스 코드 해석
$filename = 'secret.txt';
extract($_GET);
url 쿼리에서 오는 파라미터 값을 받고($_GET), 그 값으로 변수를 만든다(extract)
if (isset($guess)) {
extract에서 읽어온 파라미터, guess가 있다면 if문을 실행한다.
$secretcode = trim(file_get_contents($filename));
이후 Filename에 해당하는 전체파일을 문자열로 읽어들이고((file_get_contents) 공백을 해제한다.
if ($guess === $secretcode) {
filename에 해당되는 내용과 guess값이 일치하면 값을 해제하고,
$flag = file_get_contents('flag.txt');
echo "<p>flag is"." $flag</p>";
이 값을 도출하며,
} else {
echo "<p>비밀 코드는 $guess (이)가 아닙니다. </p>";
아니면, 아니라는 것을 도출한다.
}
}
?>
이 코드에서의 취약점은 Extract이다.
Extract 배열 속의 키값을 변수화 시켜주는 함수이다.
ex)
$islyex=array(
“key”=>”isly”
);
$extract($islyex);
File_get_content 함수는 아무것도 들어가 있지 않으면 동작하지 않기에
secret코드에 아무런 값이 들어가 있지 않을 것이고,
따라서 filename을 빈 값으로 새로 선언하고, guess 변수에도 secretcode와 똑같이 되도록 빈 값을 선언하면 flag가 나온다.
flag: HackCTF{3xtr4c7_0verr1d3ds_pr3vi0u5_kn0wn_v4r1abl35}
05. Input Check [150]
- 문제 웹사이트로 접속하면 아래와 같은 창이 확인된다.
- 문제에서 요청한 대로 flag라는 값을 입력하여 OK를 클릭해 본다.
- No Hack~ 이라는 문구가 출력되며, URL이 변경된다. URL에서 text=flag 라는 값에 주목하자.
- HTML 소스코드를 확인했을 때, 다음과 같이 출력된다.
- 주석으로 힌트가 나와있는데, 입력 명령어 확인이 배열 타입이라고 알려준다.
<!-- Hint : Input Command Check is Array Type ~ ~ -->
- 주소창에 text=flag 를 text[]=flag 로 변경해서 입력하고 Enter를 누른다.
- 플래그값이 출력된다.
flag : HackCTF{y0u_are_catch_f1ag!!}
- 해석
본 문제는 php strcmp 취약점 이용한 문제이다. (php5.3 버전에서 발생하는 취약점)
해당 취약점에선 함수에 문자열을 인자로 넣어야 하는데 배열을 인자로 넣으면 반환 값이 0이다.
<?php
$flag = 'flag';
1) if ($_GET['text'] == 'flag')
die("No Hack~");
2) if (strcmp($flag, $_GET['text']) == 0)
die("플래그 출력");
?>
text값으로 array값의 flag를 입력하면
1)에서는 array값으로 들어오게 되어 get값에 입력된 값이 null로 들어가 필터링을 우회할 수 있게 된다.
2)에서 strcmp내부의 내용에도 array값이 들어오게 되어 null == 0 이 되어 플래그가 출력된다.
'4-7. 2021-2 심화 스터디 > CTF' 카테고리의 다른 글
[2021.11.06] dreamhack, HackCTF reversing, CTF문제풀이 (0) | 2021.11.06 |
---|---|
[2021.10.09] HackCTF 풀이 (0) | 2021.10.09 |
[2021.09.18] Dreamhack rev-basic 외 풀이 (0) | 2021.09.18 |
[2021.09.11]Web, pwnable 개념 정리 (0) | 2021.09.11 |
CTF 자료 조사 및 학습 계획 (0) | 2021.09.04 |