일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 28 | 29 | 30 | 31 |
- 인프런 파이썬 강의
- 안드로이드 모바일 앱 모의해킹
- 자바스크립트 강의
- 깃허브 블로그
- 깃허브 포트폴리오
- 인프런 강의 추천
- 안드로이드 리버싱
- 웃긴 파이썬
- adb
- 리버싱 플래그
- 오블완
- dreamhack reversing
- 깃허브 블로그 만들기
- 더오름
- 강의 체험단 1기
- 인프런 깃허브 강의
- 자바스크립트
- 리버싱
- 안드로이드 adb
- 기드라
- 간단한 깃허브 블로그
- 제주코딩베이스캠프
- 잔디 심기
- 파이썬
- 드림핵 리버싱
- 드림핵 플래그
- 제주ICT
- 위니브
- 티스토리챌린지
- adb 옵션
- Today
- Total
해보자고
[드림핵] Simple Patch Me 본문
# 문제
문제 링크 | https://dreamhack.io/wargame/challenges/669
Simple Patch Me
Description 이 문제는 실제 시간으로 365일이 흐르면 플래그를 출력하는 프로그램이 주어집니다. 프로그램을 패치하여 플래그를 획득하세요! 플래그 형식은 DH{...} 입니다. Reference Ghidra Roadmap
dreamhack.io
이 문제는 실제 시간으로 365일이 흐르면 플래그를 출력하는 프로그램이 주어집니다.
프로그램을 패치하여 플래그를 획득하세요!
(일단, 글 시작에 앞서 툴 사용법을 공부 하지 않아 IDA 갔다가, 기드라 갔다가, GDB갔다가 결국은 깨져버린 플래그가 되었으나... 저의 방식대로 하시면 플래그는 나오는 듯요..)
1. 실행 흐름 훑어보기
먼저, flag가 나올 부분을 string 검색을 통해 찾아주었고, flag 를 출력하기 까지의 실행 흐름을 IDA의 그래프뷰로 이해했습니다.
flag가 출력되기 전에 cmp로 eax(cs:dword_40404C 참조 값)와 8789(0x2237)를 비교하여 8759보다 작거나 같기전까지 loc_4012A1으로 분기(8760시간 = 365일, 즉 365일을 넘어야만 flag가 보이는 함수로 분기) 한다. 이는 아래의 디컴파일된 함수들을 통해 이해할 수 있다.
FUN_004010a0 함수는 3,600초(1시간)를 가만히 기다리고 1시간이 지나면 DAT_0040404c 가 1씩 상승한다는 것을 알 수 있다.
아무튼, 이는 사실 드림핵에서 친절하게 이런 함수야~ 하고 알려줘서 굳이 이해할필요까진 없지만...? 우리가 어떤 값을 패치하는데 힌트는 될 수 있다. 다양한 패칭을 할 수 있지만 나는 365일 전에 flag가 반환되도록 JBE 명령어를 JA 명령어로 패칭하기로 했다.
JBE(Jump if (unsigned) below or equal): 비교된 두 값 중 첫 번째 값이 두 번째 값보다 작거나 같으면 점프가 발생.
-> 어셈블리상 첫 번째 값은 cs:dword_40404C 참조 값, 두 번째 값은 365일.
JA( Jump if Above ): 첫 번째 값이 두 번째 값보다 크면 점프.
-> whlie문을 한 번도 안 돌고 바로 건너뛰기!
2. 패칭하기
그런데.. 이제 깨져버린..
하지만.. 그렇지만,, 이거 플래그 맞는 듯..!
'리버싱' 카테고리의 다른 글
[드림핵] Easy Assembly (0) | 2025.04.24 |
---|---|
[CodeEngn] Malware L07 (0) | 2025.04.22 |
[드림핵] Small counter (0) | 2025.04.10 |
[드림핵] simple crack me (0) | 2024.11.19 |
[드림핵] Secure Mail (0) | 2024.11.14 |