본문 바로가기

Pay1oad/Pwnable Study

[Pay1oad] Pwnable Study Week 2 - bof_basic

<Homework>

2.  bof_basic 폴더 안에 있는 bof_basic 바이너리를 익스플로잇하여 flag 출력하기

 

<Environment>

Macbook Air 15, Apple M2, 16GB ram, 1TB storage

MAC Sequoia 15.1 Beta (24B5070e)

Parallels Desktop 18 for Mac (Ubuntu 22.04 ARM 64)

IDA Freeware 8.2

 

 

제공된 file은 bof_basic이라는 binary file이다.

 

우선 우리의 만능 gdb로 먼저 살펴보면, stack에 0x20 size의 space를 allocate하는 것을 확인할 수 있고, 특정 string을 print하고 function scanf로 입력을 받아 비교하고 main+109로 jle하는 등의 process flow를 확인할 수 있다. 좀 더 자세히 보기 위해 IDA로 확인해보자.

 

 

보다시피 scanf 이후 0x13과 비교, jle 즉 작거나 같으면 jump 하는 것을 확인할 수 있다. scanf로 입력 받은 size 만큼 buffer에 입력할 수 있는데, buffer size는 0x20이기 때문에 이를 우회해야 bof를 일으킬 수 있다.

우선 해당 조건을 충족하기 위해서는 음수 이거나 0이어야 한다. 여기서 integer overflow를 생각할 수 있는데 function read의 원형을 살펴보면,

ssize_t read(int fd, void *buf, size_t count);

 

이렇게 구성되어 있는 것을 볼 수 있는데 assembly를 확인해보면 fd(file descriptor)에 0, buf에 buffer의 pointer가 들어가고, count에는 scanf로 입력받은 value가 들어가는 것을 확인할 수 있다. 이 부분에서 주목해야 할 점은 바로 size_t라는 자료형인데 size_t는 해당 system에서 어떤 object나 value가 포함할 수 있는 maximun size의 data를 표현하는 type로 반드시 unsigned type로 나타낸다.

즉 음수가 들어갈 경우, 예상치 못한 큰 value가 들어갈 수 있다는 것이다.