728x90
반응형
해당 문제는 Dreamhack CTF Season 4 Round #2 (🌱Div2) 에 출제된 문제입니다.
1. 프로그램 분석
주어진 문제파일을 다운로드한 뒤, 자세한 분석을 위해 디컴파일 했습니다.
소스코드 입니다.
undefined8 main(void)
{
int iVar1; // 정수형 변수 iVar1 선언
size_t sVar2; // 문자열 길이를 저장할 변수 sVar2 선언
int local_14; // 지역 변수 local_14 선언
int local_10; // 지역 변수 local_10 선언
int local_c; // 지역 변수 local_c 선언
puts("Input: "); // "Input: " 메시지 출력
__isoc99_scanf(&DAT_00102010, input); // 사용자로부터 입력을 받아 변수 input에 저장
sVar2 = strlen(input); // 입력된 문자열의 길이를 확인하여 변수 sVar2에 저장
// 입력된 문자열의 길이가 64(0x40)이면 처리를 시작합니다.
if (sVar2 == 0x40) {
// 입력된 문자열을 처리하여 변형하고 rot 배열에 저장하는 반복문
for (local_c = 0; local_c < 0x40; local_c = local_c + 1) {
(&rot)[local_c] = input[local_c] + 0xd & 0x7f;
}
result[0] = DAT_001040df; // result 배열의 첫 번째 요소에 값을 설정
// rot 배열의 내용을 역순으로 처리하여 result 배열에 저장하는 반복문
for (local_10 = 1; local_10 < 0x3f; local_10 = local_10 + 1) {
result[local_10] = (&rot)[0x3f - local_10];
}
result[63] = rot; // result 배열의 마지막 요소에 rot 배열을 저장
// result 배열의 값에 3을 XOR 연산하여 result2 배열에 저장하는 반복문
for (local_14 = 0; local_14 < 0x41; local_14 = local_14 + 1) {
result2[local_14] = result[local_14] ^ 3;
}
}
// result2 배열과 주어진 문자열을 비교하여 일치하는지 확인
iVar1 = strncmp(result2, "C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q", 0x40);
if (iVar1 == 0) {
puts("\nNice!"); // "Nice!" 메시지 출력
printf("Flag is DH{%s}\n", input); // 입력된 문자열을 포함한 플래그 출력
}
return 0; // 프로그램 종료
}
해당 프로그램이 사용자로부터 입력을 받아 처리하는 과정은 다음과 같습니다.
1. `puts("Input: ");`: 사용자에게 "Input: "이라는 메시지를 출력하여 입력을 요청합니다.
2. `__isoc99_scanf(&DAT_00102010,input);`: 사용자가 입력한 값을 문자열로 받아들입니다. 여기서 `DAT_00102010`은 입력된 문자열이 저장될 메모리 위치를 나타냅니다.
3. `sVar2 = strlen(input);`: 입력된 문자열의 길이를 확인합니다.
4. `if (sVar2 == 0x40) {`: 입력된 문자열의 길이가 0x40(64)인지 확인하는 조건문입니다.
5. `(&rot)[local_c] = input[local_c] + 0xd & 0x7f;`: 입력된 문자열을 변형시키는 반복문입니다. 각 문자에 0xd를 더하고, 결과가 0x7f를 초과하지 않도록 조정하여 `rot` 배열에 저장합니다.
6. `result[0] = DAT_001040df;`: `result` 배열의 첫 번째 요소에 값을 설정합니다.
7. `result[local_10] = (&rot)[0x3f - local_10];`: `result` 배열을 초기화한 후, `rot` 배열의 내용을 역순으로 저장합니다.
8. `result[63] = rot;`: `result` 배열의 마지막 요소에 `rot` 배열을 저장합니다.
9. `result2[local_14] = result[local_14] ^ 3;`: `result` 배열의 각 요소에 3을 XOR 연산하여 `result2` 배열에 저장합니다.
10. `iVar1 = strncmp(result2,"C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q",0x40);`: `result2` 배열과 주어진 문자열을 비교하여 일치하는지 확인합니다.
11. `if (iVar1 == 0) {`: 일치한다면 다음을 실행합니다.
12. `puts("\nNice!");`: "Nice!"라는 메시지를 출력합니다.
13. `printf("Flag is DH{%s}\n",input);`: 입력된 문자열을 포함한 플래그를 출력합니다.
14. `return 0;`: 프로그램을 종료합니다.
2. 페이로드 분석
이 프로그램에서는 입력된 문자열을 역순으로 배열하고 XOR 연산 및 다른 변형을 적용하여 처리합니다. 이러한 변형 과정을 역으로 적용함으로써 원래의 플래그를 복원할 수 있습니다
아래는 변형된 문자열을 역으로 해독하고, 원래의 플래그를 복원하는 익스플로잇 스크립트 입니다.
# 주어진 문자열
text = "C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q"
# 1. 주어진 문자열을 역순으로 배열하고, 각 문자에 3을 XOR 연산합니다.
text2 = ''.join([chr(ord(c) ^ 3) for c in reversed(text)])
# 2. 각 문자에 -13을 적용하여 원래 문자열을 복원합니다.
text3 = ''.join([chr((ord(c) - 13) & 0x7f) for c in text2])
# 복원된 문자열 출력
print(f"Flag is DH{{{text3}}}")
이 Exploit 코드는 다음과 같은 과정을 거쳐 플래그를 획득합니다.
- 주어진 문자열을 역순으로 배열하고, 각 문자에 3을 XOR 연산하여 변형합니다.
- 변형된 문자열에 -13을 적용하여 원래 문자열을 복원합니다.
- 복원된 문자열을 출력하며, 이를 플래그 형식에 맞추어 출력합니다.
3. FLAG
더보기
DH{e615b75a4d563ac971466e05641d7aed556b62fcb460b6027f126bff411bfe63}
문의는 댓글 남겨주세요
728x90
반응형
'CTF 풀이' 카테고리의 다른 글
[드림핵] [wargame.kr] dmbs335 풀이 (+SQLI 치트시트) (17) | 2024.02.23 |
---|---|
[드림핵] chinese what? - RSA CRT 암호학 문제 풀이 (1) | 2024.02.16 |
[드림핵] Relative Path Overwrite Advanced 풀이 (1) | 2024.02.07 |
[드림핵] php-1 풀이 (+LFI치트시트) (1) | 2024.02.01 |