247CTF 에서 제공하는
간단한 버퍼오버플로우 문제
문제에서는 hidden_flag_function 바이너리 파일과
원격 접속 주소가 제공된다.
IDA 를 이용해 해당 바이너리를 열어봤을 때
flag, chall, main 세 함수가 정의되어 있었다.
main 함수에서는
chall 함수를 호출하고 있고
chall 에서는 scanf로 사용자의 입력을 받는다.
v1 의 크기가 68인데 입력값 범위를 체크하지 않아
버퍼오버플로우가 가능해 보인다.
마지막 flag 함수는
서버 내부의 flag.txt 파일을 불러와 내용을 출력해주는데
어디서도 호출하고 있지 않아 실행되지 않는 함수이다.
버퍼오버플로우를 통해 리턴 주소를 변경시켜 flag 함수가 실행되도록 만들어야 한다.
pwndbg를 이용해 바이너리를 분석한다.
info func 명령을 통해
함수의 주소를 기억해 둔다.
b chall 로 chall 함수에 브레이크포인트를 걸고
r 로 실행시켜 준다.
브레이크 포인트가 걸리면
ni를 계속 입력해
scanf 로 사용자 입력을 받는 부분까지 넘어가준다.
입력을 받으면 aaaa 라고 입력해준다.
x/100wx $esp 로 스택을 살펴보면
아까 입력한 aaaa(0x61616161)이 스택에 들어가 있는것을 볼 수 있다.
지금은 chall 함수에 있으므로
return 이되면 main 으로 돌아가야 한다.
main 함수의 주소는 0x0804864a 인데
다시한번 스택에서 보면
aaaa 로부터 얼마 떨어지지 않은 부분에서 주소를 찾을 수 있다.
그럼 이제부터 할일은
0x0804864a 바로 앞까지는 aaaa 같은 아무 값으로 채워넣고,
0x0804864a는 flag 함수의 주소인 0x08048576 로 덮어쓰는 것이다.
from pwn import *
p = remote('원격주소', 원격포트)
p.sendline(b'a'*76 + p32(0x08048576))
p.interactive()
pwntool 을 이용해 이렇게 간단하게 작성할 수 있다.
a 를 76개 채워넣고, 그다음 flag 함수의 주소를 붙혀주면 된다.
코드를 실행시키면
플래그를 찾을 수 있다.
'워게임 > 247CTF' 카테고리의 다른 글
[247CTF] THE MORE THE MERRIER - 리버싱 / HxD (137) | 2023.10.08 |
---|---|
[247CTF] SENSITIVE SERVER MEMORY - MISC / Metasploit (150) | 2023.10.06 |
[247CTF] MY MAGIC BYTES - 암호학 / XOR (197) | 2023.10.02 |
[247CTF] AN IMPOSSIBLE NUMBER - MISC / 정수 오버플로우 / C (167) | 2023.10.01 |
[247CTF] THE TEXT EDITOR JAIL - MISC / Vim (158) | 2023.09.28 |