본문 바로가기

전체 글528

[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.
[DIMI CTF] ezheap 118명 중에 7명이 위 문제를 풀었다. 문제에서 주어진 파일을 실행하면 다음과 같이 5가지의 선택 메뉴가 출력된다. ghidra 라는 정적 분석 툴을 이용해서 주어진 실행 파일을 분석하겠다. 위 그림은 ghidra로 분석한 메인 함수의 어셈블리 코드다. ghidra의 decompile 기능을 이용해 디컴파일을 시도하면 아래와 같은 코드를 볼 수 있다. void main(void) { undefined8 uVar1; basic_ostream *this; inital(); menu(); uVar1 = scanInt(); switch(uVar1) { case 0: this = operator 2021. 3. 26.
[DIMI CTF] exec me 118명 중에 15명이 위 문제를 풀었다. 문제에서 주어진 주소로 이동하면 View Source 라는 링크가 출력된다. 해당 링크를 클릭하자. 링크로 이동하면 아래와 같은 php 코드가 출력된다. 2021. 3. 25.