본문 바로가기

전체 글539

[Dreamhack] basic_exploitation_000 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); printf("buf = (%p)\n", buf); scanf("%141s", buf); return 0; } 위 코드는 문제에서 주어진 코드이다. 취약점은 0x80 바이트 크기의 buf 변수에 sca.. 2021. 4. 6.
[Dreamhack] broken-png 문제에서 주어진 파일을 HxD64 툴을 이용해 실행한다. 처음 8바이트 89 50 4E 47 0D 0A 1A 0A는 PNG를 의미하는 시그니처이다. 다음으로 IHDR 청크는 PNG 시그니처 바로 뒤에 위치하면 그림과 같이 0x10부터 0x1C까지 13바이트를 차지한다. 아래와 같이 첫 8바이트는 이미지 폭과 높이 정보를 저장한다. 현재 위 그림에는 폭: 0x00000200, 높이: 0x00000100 이므로 10진수로 나타내면 폭: 512, 높이: 256이다. 높이를 512로 바꿔주고 이미지 파일을 실행하겠다. { Length : 00 00 00 0D (13 byte), Chunk Type : IHDR, Chunk Data ( 13 byte ), { Width (4 byte), Height (4 byte.. 2021. 3. 30.
[Dreamhack] rev-basic-7 문제에서 주어진 파일을 IDA Pro7.5로 실행한다. Correct를 출력하기 위해 check 함수에 들어간다. 입력할 문자열을 input[i], 140003000에 저장된 문자열을 buf[i]라고 가정하면 if문의 조건이 거짓이 되기 위해서 아래와 같은 식이 만족해야한다. i xor rol(input[i] , (i and 7) ) = buf[i] 해당 식의 양쪽에 xor i를 해주고 (i and 7) 만큼 ror 해주면 아래와 같은 식이 된다. input[i] = ror(i xor buf[i] , i and 7) 더 풀어서 식을 정리하면 아래와 같이 정리할 수 있다. input[i] = ((i xor buf[i]) >> (i and 7)) + ((i xor buf[i]) > j; tmp2 = fx[i] 2021. 3. 30.
[Dreamhack] rev-basic-5 문제에서 주어진 실행파일을 IDA Pro7.5에서 실행하면 위 그림과 같이 sub_140001000 함수 결과가 참이 나오면 Correct가 출력된다. return 1을 반환하기 위해서는 조건문이 거짓이 되어야 하므로 입력할 문자열을 input이라고 하고 140003000에 저장된 문자열을 buf라고 가정하면 input[i+1]+input[i]=buf[i]가 되어야한다. input[i]를 구하기 위해서 식을 변형하면 아래 식과 같이 규칙이 존재한다. input[0]-input[24]=buf[0]-buf[1]+buf[2]-buf[3]+...-buf[23] input[1]+input[24]=buf[1]-buf[2]+buf[3]-buf[4]+...+buf[23] 중요한점은 입력할 문자열의 마지막은 널 바이트이.. 2021. 3. 30.
[Dreamhack] rev-basic-4 int __cdecl main(int argc, const char **argv, const char **envp) { char v4[256]; // [rsp+20h] [rbp-118h] BYREF memset(v4, 0, sizeof(v4)); sub_1400011C0("Input : ", argv, envp); sub_140001220("%256s", v4); if ( (unsigned int)sub_140001000((__int64)v4) ) puts("Correct"); else puts("Wrong"); return 0; } IDA Pro7.5를 이용해 디스어셈블하면 위와 같은 코드를 볼 수 있다. Correct 바로 위의 if 조건문이 참이면 Correct를 출력한다. __int64 __fas.. 2021. 3. 30.
[Dreamhack] rev-basic-3 문제 파일을 다운로드 받고 IDA Pro 7.5를 실행하면 위 그림과 같이 디스어셈블할 수 있다. Correct를 출력하기 쉬해서는 sub_140001000(v4) 함수가 참을 반환해야 Correct가 출력된다. sub_140001000 함수로 들어가서 코드를 분석하겠다. for ( i = 0; (unsigned __int64)i 24번 반복한다. if ( byte_140003000[i] != (i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i ) return 0i64; byte_140003000[i] 과 ((i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i )가 같으면 if 문이 거짓이 되어 return 0; 을 실행하지 .. 2021. 3. 30.
[Dreamhack] web-misconf-1 문제에서 주어진 주소로 이동하면 위 그림과 같은 사이트로 접속된다. 보통 이러한 웹 서버의 관리자 초기 아이디와 비밀번호는 admin이므로 한번 입력해준다. 아이디와 비밀번호가 웹 서버 생성 초기의 상태 그대로이므로 로그인된다. 문제에서 Organization에 플래그가 있다고 힌트를 줬으므로 페이지 왼쪽에 Server Admin에 Orgs로 들어간다. Sever Admin의 Orgs에는 플래그가 존재하지 않는다. 하지만 바로 옆의 Settings 메뉴에 들어가면 그림과 같이 플래그가 출력된다. 플래그: DH{default_account_is very dangerous} 2021. 3. 29.
[Dreamhack] command-injection-1 문제에서 주어진 주소로 접근하면 위 그림과 같이 ping 명령어를 사용할 수 있는 웹 페이지가 출력된다. 8.8.8.8을 입력하면 위 그림과 같이 쉘 출력결과와 같은 화면이 출력된다. 다른 명령어를 입력하면 즉각적으로 위 그림과 같이 경고 창이 뜨면서 실행할 수 없다. ;문자열을 사용해서 우회를 시도했지만 필터링된다. 하지만 해당 기능은 버프 스위트로 확인하면 자바스크립트로 작성된 기능이므로 클라이언트 측면에서만 동작한다. 따라서 버프스위트로 파라미터를 수정하겠다. 버프스위트로 패킷을 인터셉트하면 host 파라미터에 8.8.8.8이 저장된다. 해당 파라미터에 값을 수정하겠다. 파라미터 값 뒤에 ;ls 를 붙여서 ls 명령어를 실행하겠다. 하지만 파라미터를 둘러싸고 있는 "때문에 오류가 난다. 해당 형식에.. 2021. 3. 29.
[Dreamhack] image-storage 문제에서 주어진 주소로 이동하면 위 그림과 같은 페이지가 출력된다. Upload 메뉴를 선택하면 파일을 업로드할 수 있는 폼이 출력된다. 필자는 칼리리눅스에서 기본적으로 제공하는 simple-backdoor.php를 업로드하였다. 파일을 업로드하면 해당 페이지에는 필터링 기능이 전혀 없음을 알 수 있다. php 파일이 업로드 된다는 것은 공격자가 웹쉘을 업로드할 수 있기 때문에 취약점이 존재한다. 업로드한 파일을 List 메뉴에서 클릭한다. 업로드한 웹쉘로 이동하면 사용법이 출력된다. 주소 창에 host1.dreamhack.games:17423/uploads/simple-backdoor.php?cmd=ls 과 같이 뒤에 cmd 변수에 명령어를 주입하여 새로고침을 누르면 위 그림과 같이 해당 웹페이지의 디.. 2021. 3. 29.