tryhackme의 리버싱 챌린지 Compiled을 풀어보자
챌린지나 워게임 ctf 몇 번 풀어보니까 재밌어서 계속하게 됨
powershell에서 strings 명령어로 일단 분석을 해보니 구조가 나온다
PE 파일에서 배웠던 .data .bss .rodata 등의 섹션이 발견된다
근데 .Compiled 프로그램을 실행할 수 있는 환경이 없어서 IDA로 정적분석을 해봐야겠다
함수의 프롤로그도 보이고 패스워드를 입력하라는 구문과 scanf 함수가 보인다.
패스워드 입력값에 따라 Correct 혹은 Try again을 출력하는 프로그램임을 알 수 있다.
그럼 이제 출력값의 조건 소스코드를 디컴파일해서 살펴보자
int __fastcall main(int argc, const char **argv, const char **envp)
{
char s1[32]; // [rsp+20h] [rbp-20h] BYREF
fwrite("Password: ", 1uLL, 0xAuLL, _bss_start);
__isoc99_scanf("DoYouEven%sCTF", s1);
if ( (strcmp(s1, "__dso_handle") < 0 || strcmp(s1, "__dso_handle") > 0) && !strcmp(s1, "_init") )
printf("Correct!");
else
printf("Try again!");
return 0;
}
- fwrite("Password: "): 패스워드 입력하라는 문장이 출력되는 부분
- isoc99_scanf("DoYouEven%sCTF", s1): 입력값을 s1에 입력해 %s에 넣게 된다
- (strcmp(s1, "dso_handle") < 0 || strcmp(s1, "dso_handle") > 0: strcmp 함수는 비교값이 같으면 0을 출력한다. 만약 사용자가 dso_handle이라는 값을 입력하면 0<0, 0>0 모두 거짓이므로 최종적으로 0이 되는 것
- !strcmp(s1, "_init"): _init이라는 값이 s1과 같으면 0이 되고 !에 의해 1이 된다
즉, "Correct!"를 출력하기 위해서는 __dso_handle은 포함하지 않고 _init은 포함해야 한다.
그런데 처음 부분에 DoYouEven%sCTF 사이에 입력값이 들어갈 테니
패스워드 DoYouEven_initCTF를 시도해 봤으나 실패했다
정답은 DoYouEven_init 이여서 바로 맞혔다
정답을 맞히기는 했는데 뭔가 찜찜한 느낌이 들어서 gpt한테 물어보니까
프로그램은 DoYouEven%sCTF 형식을 요구하는 것처럼 보이지만,
실제로는 **그 사이에 있는 init**만 입력받아 비교합니다.
init뒤에 CTF가 붙어있기 때문에 strcmp에서 문제가 생기는 것 같다!
'Writeup' 카테고리의 다른 글
[Dreamhack] 리버싱 rev-basic-4 Writeup (0) | 2025.02.22 |
---|---|
[웹해킹] Authentication vulnerabilities_Password reset broken logic Writeup (0) | 2025.02.21 |
[Dreamhack] 리버싱 rev-basic-3 Writeup (0) | 2025.02.20 |
[Dreamhack] 리버싱 rev-basic-2 Writeup (0) | 2025.02.20 |
[Dreamhack] 리버싱 rev-basic-0 rev-basic-1 Writeup (0) | 2025.02.20 |