Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- L16
- 코드엔진 베이직 13
- L17
- Basic
- Dreamhack
- Pwnable
- rev-basic-6
- 포너블
- rev-basic-7
- basic_exploitation_000
- 드림핵
- off_by_one_001
- CodeEngn
- basic_exploitation_001
- RCE
- rev-basic-1
- rev-basic-5
- coin1
- L15
- rev-basic-4
- sd카드 리더기
- L18
- off_by_one_000
- 코드엔진 베이직
- out_of_bound
- rev-basic-0
- rev-basic-3
- pwnable.kr
- rev-basic-2
- sint
Archives
- Today
- Total
서브웨이
dreamhack rev-basic-5 풀이 본문
자 다음문제를 풀어봅시다.
일단 실행시켜봅시다.
일단 아무거나 입력해놓고 검증하는 부분을 여느때와 같이 찾아봅시다.
일단 참조된 문자열을 검색하고 거기서 검증 부분을 찾습니다.
그럼 중단점이 걸린 저 부분이 검증하는 함수로 이동하는 부분이 됩니다.
저 함수로 들어가봅시다.
뭐 딱히 길진 않습니다.
한번 분석해보면
이렇게 정리됩니다.
암호문은 다음과 같습니다.
이걸 다시 한번 요약하면
str[i] + str[i+1] == enc[i]
이렇게 암호화가 되는것을 알 수 있습니다.
자 그럼 올바른 입력값을 찾아야하는데, 처음부터 찾는건 경우의 수가 많아져서 거의 불가능합니다.
하지만 마지막 암호문이 00이므로 마지막 평문도 00이라는것을 알 수 있습니다.
그럼 마지막에서 두번째 평문은 당연히 마지막에서 두번째 암호문과 같겠죠?
그럼 이제부터 뒤에서부터 차례대로 구해나가면 됩니다.
구하는 코드는 다음과 같습니다.
encrypted = [0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3, 0xA1, 0x98, 0x4C, 0x00]
latest = 0
flag = []
for i in range(23, -1, -1):
latest = encrypted[i] - latest
flag.append(chr(latest))
flag.reverse()
print(''.join(flag))
결과는 다음과 같습니다.
'Reverse Engineering > dreamhack' 카테고리의 다른 글
dreamhack rev-basic-7 풀이 (0) | 2021.07.28 |
---|---|
dreamhack rev-basic-6 풀이 (0) | 2021.07.28 |
dreamhack rev-basic-4 풀이 (0) | 2021.07.28 |
dreamhack rev-basic-3 풀이 (0) | 2021.07.21 |
dreamhack rev-basic-2 풀이 (0) | 2021.07.21 |
Comments