WriteUp

[pwnable] Dreamhack - Datestring

nono20 2024. 8. 16. 18:11

글쓴이는 pwnable 매우 매우 초보자이다.

 

  • [문제 파악]

파일을 실행시켰을 때 년, 달, 날, 시, 분, 초를 입력받고 입력받은 걸 토대로 구성된 date를 보여주고 있다.

datestring 실행


  •  [문제 해결]

밑의 사진은 main() 함수의 일부분이다. 보면 rbp-0x4 위치의 4바이트 값이 0이 아니라면 flag() 함수를 실행시킬 수 있다.

main() 함수 일부분

 

rbp-0x84

rbp-0x90

rbp-0x4 => 0x0

rbp-0x6c => Year 입력값

rbp-0x4c => Year - 0x76c 값 저장

rbp-0x68  => Month 입력값 후에 뭔가를 빼고 나누고 더한 거 같음

rbp-0x50 => rbp-0x68 값 저장

rbp-0x64 => Day 입력값 후에 뭔가를 빼고 나누고 더한 거 같음

rbp-0x54 => rbp-0x64 값 저장

rbp-0x70 => Hour 입력값 후에 뭔가를 나누고 곱하고 더한 거 같음

rbp-0x58 => rbp-0x70 값 저장

rbp-0x74 => Minute 입력값 후에 뭔가를 나누고 더하고 빼는 거 같음

rbp-0x5c => rbp-0x74 값 저장

rbp-0x78 => Second 입력값 후에 뭔가를 곱하고 나누고 더하는 거 같음

rbp-0x60 => rbp-0x78 값 저장

 

rbp-0x68 위치의 값을 2랑 비교하는 조건문이 있음.

 

rbp-0x20 => 뭐가 저장되어 있는 거지?

rbp-0x48 => 연산식

 

마지막에 rbp-0x50 위치의 값이 11이어야 하고 rbp-0x54 위치의 값이 25여야 하고 rbp-0x48 위치의 값이 0이어야 하고 rbp-0x4 위치의 값이 0이 아니라면 flag() 함수 실행된다.

 

 

예상해본 스택 구조

 


  • 작성해 본 익스플로잇 코드

rbp-0x4 위치의 값이 원래 0으로 저장되어 있는데 1로 바꾸려고 한다. 그래서 익스플로잇 코드를  짜봤지만 돌아가지 않는다. 수정이 필요해 보인다.

from pwn import *

p = remote('주소' , '포트')

payload = b'A' * 36 
payload += b'25\n'   
payload += b'B' * 3  
payload += b'11\n'   
payload += b'C' * 7  
payload += b'0\n'    
payload += b'D' * 67 
payload += p64(1)    

# 페이로드 전송
p.sendlineafter(b"Second: ", payload)  

# 상호작용 모드 (결과 확인)
p.interactive()

 

 

  • 문제 출처

https://dreamhack.io/wargame/challenges/1364