엇 ㅋㅋ 생각해보니 풀이자 많은 순으로 문제를 풀다보니까 거꾸로 순서가 될 때도 있네
이게 더 재밌다!
꿀팁 하나 찾았다..
https://hyemzzzy.tistory.com/110
gpt:
이 코드는 C/C++에서 작성된 프로그램의 main 함수로 보이며, 다음과 같은 기능을 수행합니다. 각 부분을 자세히 설명해 드리겠습니다.
코드 분석
int __fastcall main(int argc, const char **argv, const char **envp)
{
char v4[256]; // [rsp+20h] [rbp-118h] BYREF
memset(v4, 0, sizeof(v4)); // v4 배열을 0으로 초기화
sub_1400011B0("Input : ", argv, envp); // 사용자에게 입력을 요청
sub_140001210("%256s", v4); // 사용자 입력을 v4 배열에 저장
if ( (unsigned int)sub_140001000(v4) ) // v4에 대한 조건 검사
puts("Correct"); // 조건이 참일 경우 "Correct" 출력
else
puts("Wrong"); // 조건이 거짓일 경우 "Wrong" 출력
return 0; // 프로그램 종료
}
각 부분의 설명
- 함수 서명:
- int __fastcall main(int argc, const char **argv, const char **envp):
- __fastcall은 함수 호출 규약을 나타내며, 인자들을 빠르게 전달하기 위해 레지스터를 사용할 수 있음을 의미합니다.
- argc: 프로그램의 인자 개수입니다.
- argv: 각 인자를 저장하는 문자열 배열입니다.
- envp: 환경 변수를 저장하는 문자열 배열입니다.
- int __fastcall main(int argc, const char **argv, const char **envp):
- 스택 변수 초기화:
- char v4[256];: 크기가 256인 문자 배열을 선언하여 사용자 입력을 저장할 공간을 마련합니다.
- memset(v4, 0, sizeof(v4));: v4 배열의 모든 요소를 0으로 초기화합니다. 이는 문자열을 사용할 때 안전성을 높이기 위해서입니다.
- 사용자 입력 요청:
- sub_1400011B0("Input : ", argv, envp);:
- 이 함수는 "Input : "라는 메시지를 출력하고 사용자에게 입력을 요청하는 것으로 추측됩니다. 이 함수의 구현은 제공된 코드에 없기 때문에 세부 사항은 알 수 없습니다.
- sub_1400011B0("Input : ", argv, envp);:
- 입력 받기:
- sub_140001210("%256s", v4);:
- 이 함수는 사용자로부터 입력을 받아 v4 배열에 저장합니다. %256s 형식 지정자는 최대 256자의 문자열을 입력받도록 설정되어 있습니다. 이 부분도 함수의 구현에 따라 동작이 다를 수 있습니다.
- sub_140001210("%256s", v4);:
- 조건 검사:
- if ((unsigned int)sub_140001000(v4)):
- sub_140001000 함수를 호출하여 v4 배열의 내용을 검사합니다. 이 함수는 입력된 문자열을 처리하고 결과를 반환하는 것으로 보입니다.
- 반환 값이 0이 아니면 조건이 참으로 판단됩니다.
- if ((unsigned int)sub_140001000(v4)):
- 결과 출력:
- puts("Correct");: sub_140001000의 결과가 참일 경우 "Correct"를 출력합니다.
- puts("Wrong");: 결과가 거짓일 경우 "Wrong"을 출력합니다.
- 종료:
- return 0;: 프로그램을 정상적으로 종료합니다.
요약
이 프로그램은 사용자에게 문자열 입력을 요청하고, 그 입력을 특정 조건에 따라 검사하여 "Correct" 또는 "Wrong"을 출력합니다. 함수 sub_140001000의 세부 구현에 따라 입력된 문자열의 유효성이나 정답 여부를 판별하는 로직이 있을 것으로 예상됩니다.
이제 풀이글을 보러가자..
https://velog.io/@hamham/%EB%93%9C%EB%A6%BC%ED%95%B5-rev-basic-2-%ED%92%80%EC%9D%B4
https://s-wisdom.tistory.com/36
https://hyunhe2e.tistory.com/121
gpt:
주어진 코드 조각은 C/C++ 언어로 작성된 함수 sub_140001000의 구현을 보여줍니다. 이 함수의 기능과 작동 방식을 단계별로 분석해 보겠습니다.
함수 서명
- __int64: 함수가 64비트 정수를 반환함을 나타냅니다.
- __fastcall: 호출 규약으로, 일부 매개변수를 레지스터를 통해 전달하여 성능을 향상시키기 위해 사용됩니다.
- a1: 64비트 정수형 매개변수로, 함수 호출 시 전달되는 주소 또는 포인터입니다.
변수 선언
- i: 반복문에서 사용할 인덱스 변수입니다.
반복문
- 이 반복문은 0부터 18(0x12는 18의 16진수 표현)까지의 정수를 반복합니다.
18번 반복한다.
조건문
- 이 부분은 배열 aC에서 4바이트(32비트) 크기의 값을 가져와서, 매개변수 a1이 가리키는 메모리 위치에서 1바이트(8비트) 값을 가져와 비교합니다.
- 만약 두 값이 다르면 0LL을 반환하여 함수가 종료됩니다. 이 경우는 입력값이 올바르지 않다는 것을 의미합니다.
return 0이 false, return 1이 true
성공 조건
- 반복문이 끝까지 실행되고, 모든 비교가 성공적으로 통과하면 1LL을 반환합니다. 이는 입력값이 올바르다는 것을 나타냅니다.
전체적인 기능
이 함수의 전체적인 기능을 정리하면 다음과 같습니다:
- 목적: a1로 주어진 메모리 주소에 저장된 데이터를 검증하는 것입니다.
- 검증 방법:
- aC라는 배열에서 특정 값들을 가져와 a1이 가리키는 메모리 주소의 값들과 비교합니다.
- aC 배열은 전역 변수로 가정하며, 이 배열의 첫 18개의 4바이트(32비트) 값과 a1의 첫 18개의 1바이트(8비트) 값을 비교합니다.
- 결과:
- 모든 값이 일치하면 1을 반환하고, 하나라도 다르면 0을 반환합니다
- aC라는 배열에서 특정값을 알면 될 것 같다
사용 예시
- 이 함수는 특정 입력값이 기대하는 형식이나 내용을 충족하는지 검사하는 데 사용됩니다. 예를 들어, 사용자 입력 값이 미리 정의된 비밀번호, 키 또는 특정 형식의 데이터를 확인하는 데 유용할 수 있습니다.
결론
이 함수는 특정 조건을 만족하는지 확인하여 성공 여부를 판단하는 검증 기능을 수행합니다. 따라서 함수가 반환하는 값을 기반으로 프로그램에서 입력의 유효성을 검사할 수 있습니다.
aC를 누르면 이렇게 값이 나온다
Comp4re_the_arr4y
64dbg를 이용하는 방법은 이렇다
[cmp rax, 12] 를 통해 문자열을 0x12번 비교한다는 것을 알 수 있다.
문자열 비교 구문은 [cmp dword ptr ds:[rcx+rax*4], edx] 이다.
사용자가 입력한 edx 값과 (rcx+rax*4) 값을 비교하는데 rcx 에 무슨 값이 들어가는지 확인하면 된다.
rcx는 [lea rcx, qword ptr ds:[7FF77B223000] 구문을 통해 해당 값이 들어있는 주소를 확인할 수 있다.
주소를 따라가 값을 확인해보자.
출처:https://mokpo.tistory.com/258 [MSS:티스토리]
마우스 우클릭 덤프에서 따라가기, 상수 chall2. 00007FF77B223000 클릭
flag가 보인다.
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[46] IT 비전공자 [dreamhack]rev-basic-4문제 풀기 (2) | 2024.10.25 |
---|---|
[45] IT 비전공자 [dreamhack]Return Address Overwrite문제 풀기 (2) | 2024.10.24 |
[43] IT 비전공자 [dreamhack]basic_exploitation_001 문제 풀기 (4) | 2024.10.22 |
[42] IT 비전공자 [dreamhack]rev-basic-3 문제 풀기 (6) | 2024.10.21 |
[41] IT 비전공자 [dreamhack]image-storage문제 풀기 (2) | 2024.10.20 |