파일 명령어로 바이너리 파일을 확인했을 때 64비트 실행파일임을 확인할 수 있었다.

checksec로 보호기법을 보니 NX가 적용되어 있어서 쉘 코드 삽입은 불가능할 것 같았다.

info func 명령을 통해 함수 목록을 보면 다음과 같다.

main, jump, get_flag 함수가 눈에 띈다.

각 함수들의 어셈 코드는 다음과 같다.

main 함수에서 jump 함수를 호출하고 있고, jump 함수에서는 gets 함수로 사용자의 입력을 받고 있다. get_flag 함수에서는 fopen함수로 파일을 열어 fread함수로 내용을 읽어 리턴하고 있다.

아이다의 헥스레이 기능을 이용하여 위 함수들을 확인하면 다음과 같다.

jump 함수에서 v1이라는 변수로 64바이트를 할당하고, gets함수로 v1에 값을 입력받는데, 입력받는 값의 길이에 대한 검증이 없어서 bof가 발생할 수 있다. jump 함수에서 bof를 발생시켜 get_flag 함수로 리턴하도록 하면 서버의 flag 파일을 읽어올 수 있을 것 같다. 따라서 payload를 다음과 같이 입력값에 64(v1크기) + 8(sfp 크기) 만큼 입력하고 리턴에 get_flag 함수 주소를 넣어서 get_flag 함수를 실행시키도록 하면 될 것 같다. 따라서 익스 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
from pwn import *
 
#p = process("./JNE")
= remote("chals5.umdctf.io"7003)
pay = "A" * 72
pay += p64(0x000000000040125d)
 
p.sendline(pay)
p.interactive()
cs

 

UMD CTF 후기 : 사실 가장 오랜 시간을 잡고 있던 문제는 JIE 문제 였는데 NX 보호기법이 적용되어 있지 않아서 쉘코드 삽입하는 문제라 생각하여 그 쪽으로 접근했는데 풀리지 않아서 아쉬웠다. 같이 문제푸신 팀원중 한 분이 ROP 기법으로 문제를 JIE를 포함한 다른 문제도 풀으셨는데 이것을 보고 포너블 기법 공부를 더 열심히 해야겠다는 동기 부여를 받은것 같다. JIE문제는 쉘코드를 삽입하여 푸는 방식으로 롸업이 올라온다면 한번 확인해보고 싶다.

문제 바이너리 파일을 file 명령어로 확인해보면 64비트 실행파일임을 확인할 수 있다.

실행해보면 두 값을 더해주는 프로그램인 것 같다.

아이다로 열어서 헥스레이 기능을 이용하여 main함수를 확인하면 다음과 같다.

시스템 함수로 파이썬명령어를 실행하여 두 값을 더하고 있다. 

)'; 으로 파이썬 명령어를 닫아주고 내가 원하는 다른 명령어를 실행시킬 수 있을 것 같다. 실행할 명령어를 작성한후 ;#을 붙이면 정상적으로 원하는 명령어를 실행하고 그 결과값을 볼 수 있다. #은 리눅스 쉘에서도 주석의 역할을 하기 때문에 #으로 시스템 함수에 들어가는 남은 파이썬 명령어를 주석처리하는 것이다.

ls명령어로 확인해보니 flag 파일이 있었고, cat flag 명령으로 flag를 확인할 수 있었다.

payload : )';cat flag;#

 

HackPack CTF 후기 : 푼 문제는 파이썬 코드를 닫고 원하는 명령어를 입력한 뒤 주석처리해서 이후 구문을 무시하여 원하는 명령어만 정상적으로 실행되도록 하여 풀었는데, 웹해킹을 공부할때 원하는 쿼리를 입력하고 주석으로 이후 구문을 무시한다는 점에서  기본적인 SQL Injection 과 비슷한 느낌을 받았다. 이 문제 외에 다른 문제들도 풀려고 시도해 보려 했지만 코드가 길어지고, 아직 포너블 기초밖에 공부가 되어있지 않다보니 꽤 오랜시간을 보고 생각나는 다양한 방법들로 구글링을 시도해 보았지만 역시 쉽지 않았다. 포너블 공부를 더 열심히 해야 겠다는 생각을 하게 되었고, 다양한 기법들을 공부해서 문제에 적용해야 겠다는 생각을 하게 되었다.

문제 파일을 확인해 보니 32비트 리눅스 실행파일 이라는 것을 확인할 수 있었다.

이 파일을 gdb로 열어서 main 함수를 확인해보면 다음과 같다.

fgets 함수로 문자열을 입력 받고, printf 함수로 두 번 출력하고, ebp-0xc 의 값이 0x4030201 이면 main + 120 으로 이동하고, ebp-0xc의 값이 0xdeadbeef이면 main+120으로 이동시킨다. main+120을 보면 ebp-0xc가 0xdeadbeef 가 아닐 경우 main+ 177 로 보내서 main 함수를 종료하고, 같으면 어셈 코드가 진행되다가 system 함수가 실행되게 된다.

프로그램의 동작을 더 확실하게 알기 위해 아이다 헥스레이로 main 함수를 보면 다음과 같다.

s 라는 문자열을 받는 배열과 , v5 변수가 선언되어 있고, v5는 0x4030201로 할당되어 있고, s에는 입력값이 할당된다. s의 크기는 40이기 때문에 s 변수에서 버퍼 오버플로우를 발생시켜서 v5의 값을 바꾸면 될 것 같다.

일단 프로그램을 실행시키고 40이상의 문자을 입력하면 v5의 값이 변경되어 첫번째 조건문을 만족시킨다.

실행할 때 check 부분에 0xDEADBEEF가 들어가야 할 것 같다.

배열을 40칸 채운 후 리틀 엔디언 방식으로 0xdeadbeef를 넣어주면 시스템 함수가 실행되어 쉘을 딸 수 있다.

파이썬 pwntools 모듈을 이용하여 스크립트를 짜서 풀었다.

1
2
3
4
5
6
7
# bofex.py
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3000)
pay = "A"*40 + "\xef\xbe\xad\xde"
p.sendline(pay)
p.interactive()
cs

Web

[Robots. Yeah, I know, pretty obvious.]

문제를 보니 별 다른 링크는 없었고 설명에 로봇과 관련된 말들이 써 있길래 ctf 페이지의 robots.txt 파일을 확인해 봤다.

해당 파일은 존재 했고 파일에는 다음과 같은 내용들이 있었다.

저 파일들 중 /robot-nurses 파일에 들어가 보니 플래그가 있었다.

flag : rtcp{r0b0t5_4r3_g01ng_t0_t4k3_0v3r_4nd_w3_4r3_s0_scr3w3d}

 

[No Sleep]

문제 페이지에 들어가 보면 시간 카운트다운을 하고 있었다.

그리고 문제 페이지의 쿠키를 확인하면 다음과 같이 어떤 시간을 저장하고 있다.

이 시간이 웹 페이지에 나온 기다려야하는 시간 같으니 저 시간을 현재 시간으로 바꿔주면 플래그가 보인다.

flag : rtcp{w0w_d1d_u_st4y_up?}

 

[Phishing for Flags]

문제를 보면 이메일 압축 파일이 주어지는데 압축 해제하면 메일 파일들이 있다.

메일 파일들을 보면 GIVE ME BACK MY EYEHOLES 라는 파일의 링크를 들어가보면 riceteacatpanda.wtf/phishingemail 링크로 연결되는데 저 페이지 안에 플래그가 있다.

flag : rtcp{r34d_b3f0rE_yOU_C1iCk}

 

[What's in The Box?!]

문제를 보면 박스 이모티콘이 하나 있는데 그 이모티콘을 개발자모드로 확인해보면 a 태그로 javascript 코드가 연결되어 있다. 

이 javascript 코드를 잘 읽어보면 다음과 같이 주석으로 플래그가 나누어져 있다.

 

Cryptography

[Don't Give The GIANt a COOKie]

69acad26c0b7fa29d2df023b4744bf07 이 암호화된 문자열을 md5로 복호화 하면 chocolate mmm 라는 문자열이 나온다. 이 문자열을 플래그 형식으로 제출하면 된다.

flag : rtcp{chocolate mmm}

 

[15]

문제를 보면 다음과 같이 긴 문자열이 존재하고 하단에 플래그로 예측되는 문자열이 있다.

해당 문자열을 빈도분석 기법으로 해독해보면 암호를 해독할 수 있다. 빈도분석은 다음 사이트에서 온라인으로 분석할 수 있다. https://quipqiup.com/

flag : rtcp{c4R3Ful_w1tH_3X1f_d4T4}

 

[Forensics]

[BTS-Crazed]

문제 파일을 보면 음악 파일인데 HxD로 플래그 포맷인 rtcp를 검색해보면 플래그가 나온다.

 

flag : rtcp{j^cks0n_3ats_r1c3}

 

'Security & Hacking > CTF Write Up' 카테고리의 다른 글

[Plaid CTF 2013] ropasaurusrex  (0) 2021.08.17
[CodeGate 2017] babypwn  (0) 2021.08.10
[pbctf 2020][web] Apoche I  (0) 2020.12.08
[Insomni'hack teaser 2020][Web] LowDeep  (0) 2020.01.20

문제 페이지에 들어가면 ping을 보낼 수 있는 기능이 있어 8.8.8.8로 핑을 보내보니 정상적으로 보내지는 것을 확인할 수 있었다. 

이 과정에서 서버의 ping 명령어를 사용하는 것을 알 수 있었고 다중 명령어 사용을 의미라는 세미클론(;)으로 ls명령를 사용하여 서버의 파일 목록들을 확인할 수 있었다.

payload = ;ls

파일 목록을 보니 print-flag 라는 파일이 있었고, 해당 url을 입력하여 이 파일을 다운로드 할 수 있었다.

payload = http://lowdeep.insomnihack.ch/print-flag

 

다운로드한 파일을 hxd로 확인해 보니 elf 파일 이였고, 파일의 가장 끝부분을 보면 플래그를얻을 수 있었다.

flag : INS{Wh1le_ld_k1nd_0f_forg0t_ab0ut_th3_x_fl4g}

'Security & Hacking > CTF Write Up' 카테고리의 다른 글

[Plaid CTF 2013] ropasaurusrex  (0) 2021.08.17
[CodeGate 2017] babypwn  (0) 2021.08.10
[pbctf 2020][web] Apoche I  (0) 2020.12.08
[2020riceteacatpanda]  (0) 2020.01.26

문제를 보면 Access_Denied 라는 경고창이 뜬다.


확인을 눌러보면 password ~~ 하는 문자열이 잠시 나오고 사라진다.

잠시 나올때 그 부분을 캡처하면 다음 내용을 볼 수 있다.


여기서 나온 password값을 인증하면 문제가 해결된다.

50점인 이유가 있는 것 같다..


'Security & Hacking > Wargame' 카테고리의 다른 글

[webhacking.kr] Challenge 14  (0) 2019.06.06
[webhacking.kr] Challenge12  (0) 2019.06.06
[webhacking.kr] Challenge 11  (0) 2019.03.07
[webhacking.kr] Challenge 10  (0) 2019.03.06
[webhacking.kr] Challenge 3  (0) 2019.02.21


문제를 보면 pat 라는 변수에 정규식을 저장하고 있다.

정규식은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.


그리고 그 밑에줄의 코드를 보면 preg_match() 라는 함수를 사용하고 있는데, 이 함수는 php에서 문자열을 매칭시키는 기능을 한다.

그래서 이 코드를 해석해보면 pat의 값을 val에 GET형식으로 매칭시켜주면 Password를 출력해 주는 것 같다.


다음은 PHP 정규식을 설명한 표 이다. (출처 : https://iam777.tistory.com/m/306)

이 표를 보고 정규식을 해석해보면 1에서 3 사이의 숫자 1개, a에서 f사이의 알파벳 5개, 그리고 \t는 tab를 의미하는데, url 인코딩 하면 %09 이다.

따라서 1aaaaa_.*ip주소.*%09p%09a%09s%09s/가 나온다.


이 변수를 val 파라미터 값으로 넘겨주면 문제가 해결된다.




'Security & Hacking > Wargame' 카테고리의 다른 글

[webhacking.kr] Challenge12  (0) 2019.06.06
[webhacking.kr] Challenge 15  (0) 2019.03.08
[webhacking.kr] Challenge 10  (0) 2019.03.06
[webhacking.kr] Challenge 3  (0) 2019.02.21
[webhacking.kr] Challenge 6  (0) 2019.02.18


10번 문제에 처음 들어가면 볼 수 있는 화면이다.

회색공간의 O에 커서를 가져가면 순간적으로 yOu라고 바뀌는 것을 볼 수 있다.


이 부분의 소스코드를 확인해 보면 다음과 같은 코드가 있다.

코드를 읽어보니 posLeft가 800이 되면 ?go 라는 페이지로 이동하게 되고(if(this.style.posLeft==800)this.href='?go='+this.style.posLeft"),

한번 클릭을 할 때 마다 posLeft가 1씩 증가한다. (onclick="this.style.posLeft+=1)

또한 현재 값은 0이다.


그러나 클릭을 아무리 많이 해도 화면상의 변화가 보이지 않는다.

구글링을 통해 확인해 봤더니 이 문제는 internet explorer 브라우저에서 적용된다고 한다....ㅠ


ie브라우저에서 문제를 다시 확인해보면 여러번 클릭했을 때 다음과 같이 'O' 글자가 이동하는 것을 볼 수 있다.

이것을 800번 누르면 문제가 해결되는것 같은데 800번 누르기는 매우 힘들기 때문에 한 번 클릭씨 800이 증가하게 소스코드를 수정해 주었다.


다음과 같이 800으로 변경하고 한번 클릭하게 되면 left 값이 800이 되어 문제가 해결된다.





'Security & Hacking > Wargame' 카테고리의 다른 글

[webhacking.kr] Challenge 15  (0) 2019.03.08
[webhacking.kr] Challenge 11  (0) 2019.03.07
[webhacking.kr] Challenge 3  (0) 2019.02.21
[webhacking.kr] Challenge 6  (0) 2019.02.18
[SuNiNaTaS] Forensic 31  (0) 2019.02.11

문제를 보면 퍼즐이 있는데 로직 퍼즐 인것 같다.

로직은 숫자만큼 비어있는 칸을 색칠하는 규칙을 가진 형태의 퍼즐이다.

빈 칸을 클릭해보면 검은색으로 칠해진다.

이 퍼즐을 풀어보면 다음과 같은 모양이 나온다.


밑에 gogo 버튼을 누르면 이름을 입력하는 칸이 나온다.

이 칸에 admin이라고 입력하고 write를 누르면 

이런 내용이 나왔다.

여기의 answer값을 인증시켜 보니 답은 아니였다.

다시 name 칸으로 돌아가 소스를 확인해 보니 입력 받는 곳의 코드는 이렇게 되 있었다.


value의 값을 참으로 해주기 위해 위 코드에 or 1 을 추가해 보았다.

1을 입력하고 write를 클릭하니 no hack 라고 나왔다.

or 이라는 문자열을 필터링하는 것 같다.


or과 같은 뜻을 가진 기호인 ||를 사용하여 코드를 수정해 보자.


수정 후 1을 입력하면 다음과 같은 내용이 나오고 answer값을 인증하면 문제가 해결된다.












'Security & Hacking > Wargame' 카테고리의 다른 글

[webhacking.kr] Challenge 11  (0) 2019.03.07
[webhacking.kr] Challenge 10  (0) 2019.03.06
[webhacking.kr] Challenge 6  (0) 2019.02.18
[SuNiNaTaS] Forensic 31  (0) 2019.02.11
[SuNiNaTaS] Forensic 30  (0) 2019.02.10

문제를 보면 힌트에 base64가 있고, index.phps로 들어갈 수 있다.

index에 들어가보면 php 코드들이 있는데 

이 부분을 보면 base64로 20번 인코딩 되어 있는 것을 확인 할 수 있다.

쿠키값을 보게되면 base64로 인코딩 되어 있는 것을 볼 수 있다.


그리고 php코드의 아랫부분을 보면 

디코드 한 아이디와 패스워드의 값이 admin이면 문제가 해결되는 것 같다.


admin을 base64로 20번 디코딩 하면 다음과 같은 값이 나온다.


이 값을 user과 password의 쿠키 값에 넣으면 문제가 해결된다.


'Security & Hacking > Wargame' 카테고리의 다른 글

[webhacking.kr] Challenge 10  (0) 2019.03.06
[webhacking.kr] Challenge 3  (0) 2019.02.21
[SuNiNaTaS] Forensic 31  (0) 2019.02.11
[SuNiNaTaS] Forensic 30  (0) 2019.02.10
[SuNiNaTaS] Forensic 29  (0) 2019.02.09

+ Recent posts