일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- rev-basic-4
- coin1
- rev-basic-6
- Pwnable
- rev-basic-5
- basic_exploitation_001
- 코드엔진 베이직
- L16
- RCE
- pwnable.kr
- off_by_one_001
- Basic
- 포너블
- L18
- sint
- CodeEngn
- rev-basic-0
- rev-basic-1
- 드림핵
- sd카드 리더기
- Dreamhack
- L15
- L17
- out_of_bound
- rev-basic-3
- basic_exploitation_000
- off_by_one_000
- 코드엔진 베이직 13
- rev-basic-2
- rev-basic-7
- Today
- Total
목록Reverse Engineering/dreamhack (8)
서브웨이

리버싱 기초 마지막 문제입니다. 파일을 실행합시다. 대충 입력하고 검증하는 부분을 찾습니다. 여기서 이런 검증하는 부분을 찾을 수 있습니다. 그럼 중단점이 걸린 검증하는 함수로 들어가봅시다. 조금 길어보입니다. 대충 정리해보면 이렇습니다. 암호문은 다음과 같습니다. 일단 rol이 뭔지는 다음 링크를 확인해보시면됩니다. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sol9501&logNo=70091168321 |정수 연산 ①| 시프트와 회전 명령어 및 응용 |정수 연산 1| 시프트와 회전 명령어 및 응용 목표 : 시프트 연산의 기본적이 사용법과 응용 및 각 연산이 ... blog.naver.com 정리하자면 다음과 같은 식이 됩니..

이제 기초문제는 두문제 남았습니다. 자 파일을 봅시다. 역시나 대충 입력하고 참조된 문자열을 검색해서 검증하는 부분을 찾아봅시다. 언제나 같은 방식입니다. 그럼 중단점이 걸린 검증하는 함수로 들어가봅시다. 뭔가 조금 짧은것을 알 수 있습니다. 한번 분석해보면 이렇네요. 그럼 테이블과 암호문은 어떤값이 있는지 봅시다. 이건 암호문이고 이건 테이블입니다. 각 자리에 입력된 값을 오프셋으로 쳐서, 테이블에서 해당 오프셋에 해당하는 값이 암호문과 일치하는 입력값을 찾아야합니다. 딱봐도 귀찮아보이니 그냥 검색해서 하나하나 찾아봅시다. 검색은 다음과 같이 패턴찾기를 눌러서 찾을 부분을 입력하고 이렇게 나온 부분을 클릭해서 확인하면 됩니다. 그럼 노가다로 다 찾아보면 다음과 같은 코드를 만들 수 있습니다. encry..

자 다음문제를 풀어봅시다. 일단 실행시켜봅시다. 일단 아무거나 입력해놓고 검증하는 부분을 여느때와 같이 찾아봅시다. 일단 참조된 문자열을 검색하고 거기서 검증 부분을 찾습니다. 그럼 중단점이 걸린 저 부분이 검증하는 함수로 이동하는 부분이 됩니다. 저 함수로 들어가봅시다. 뭐 딱히 길진 않습니다. 한번 분석해보면 이렇게 정리됩니다. 암호문은 다음과 같습니다. 이걸 다시 한번 요약하면 str[i] + str[i+1] == enc[i] 이렇게 암호화가 되는것을 알 수 있습니다. 자 그럼 올바른 입력값을 찾아야하는데, 처음부터 찾는건 경우의 수가 많아져서 거의 불가능합니다. 하지만 마지막 암호문이 00이므로 마지막 평문도 00이라는것을 알 수 있습니다. 그럼 마지막에서 두번째 평문은 당연히 마지막에서 두번째 ..

조금 더 어려워진 리버싱입니다. 자 파일을 한번 봅시다. 대충 입력을 넣어주고 일단 참조된 문자열을 중심으로 검증되는 부분을 찾아봅시다. 여기서 그럼 딱봐도 검증하는 함수로 보이는 부분으로 들어갑시다. 생각보다 길지는 않습니다. 대충 정리를 해보자면 이렇습니다. 이걸 정리하자면 (문자 >> 4) or ((문자 > 4) | ((j

자 1단계 마지막 리버싱입니다. 한번 파일을 봅시다. 이번에도 어김없이 입력값 검증 형태입니다. 그럼 디버깅을 해봅시다. 일단 참조된 문자열엔 없으니 검증하는 부분으로 가봅시다. 이번에도 검증함수가 존재합니다. 한번 들어가봅시다. 딱봐도 조금 복잡해보입니다. 정리하자면 이런 구조입니다. 일단 입력한 문자열을 불러온 뒤, 0x7FF600E53000에 위치한 암호화된 문자열(?)을 불러옵니다. (입력 문자 ^ 인덱스) + 인덱스 * 2 = 암호 문자 이렇게 연산을 진행한 뒤 한 글자씩 인덱스에 맞게 총 24번 비교를 합니다. 그럼 암호화된 문자열로 검증에 필요한 문자열을 얻기 위해 공식을 수정해봅시다. 입력 문자 = (암호 -인덱스 * 2) ^ 인덱스 이 공식으로 파이썬 코드를 짜 봅시다. def cal(c..

자 이번에도 파일을 봅시다. 또 같은 방식이네요. 일단 참조된 문자열을 검색해봅시다. 여기도 일단 안보이네요. 그럼 입력값을 검증하는 곳으로 한번 가봅시다. 여기도 출력, 입력 뒤에 정체 불명의 함수가 있네요. 여기서 검증을 하는 것 같습니다. 그럼 들어가봅시다. 자 일단 대충 흐름을 보자면 처음에 rcx에는 입력 값의 주소가 들어있습니다. 해당 값을 저장해놓은뒤 12번에 걸쳐서 0x7FF7A6273000에 존재하는 문자열과 입력한 문자열을 차례로 한 글자씩 같은지 비교를 하는 함수입니다. 그럼 0x7FF7A6273000에 어떤 것이 존재하는지 한번 봅시다. 해당 주소를 덤프에서 따라가면 다음과 같은 것들이 존재합니다. 저게 답입니다.