분류 전체보기

    [HackCTF] Look at me (재)

    check - 32bit - NX - Partial RELRO - statically linked library >> 많은 함수들이 바이너리 파일 내에 저장되어 있고 plt와 got 주소가 따로 분리되어 있지않다. Analyze pseudo code - 0x18byte만큼 할당받은 스택 버퍼 v1에 gets함수를 통해 값을 입력받는다. 이 때 크기 제한이 없기 때문에 오버플로우가 발생할 수 있다. functions system 함수와 "/bin/sh" 문자열이 현재 바이너리에 포함되어 있지 않다 + statically linked library >> system함수 호출이 아닌 다른 방식으로 exploit 할 수 있어야한다! ex. mprotect / execve(int 0x80) >> "/bin/sh"..

    [SWEA] 1936. 1대1 가위바위보

    문제 A와 B가 가위바위보를 한다. 가위: 1, 바위: 2, 보: 3 로 입력을 받고, 입력받는 순서대로 A와 B가 낸 값이라고 한다. 이긴 사람의 알파벳을 출력한다. (단, 비기는 경우는 없다고 한다.) 입력: 정수 2개 (차례로 A와 B의 가위/바위/보) 출력: 문자 (이긴 사람) 풀이 import java.util.Scanner; import java.io.FileInputStream; class Solution { public static void main(String args[]) throws Exception { Scanner sc = new Scanner(System.in); int a,b; a = sc.nextInt(); b = sc.nextInt(); System.out.print(a>b..

    [SWEA] 2058. 자릿수 더하기

    문제 사용자가 입력한 숫자의 각 자리의 숫자들을 더한 결과를 출력한다. 입력: 1부터 9999사이의 자연수 출력: 입력한 값의 각 자리 숫자들을 더한 값 풀이 import java.util.Scanner; import java.io.FileInputStream; class Solution { public static void main(String args[]) throws Exception { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); int sum = 0; int tmp; for(int i=1000;i>=1;i/=10){ tmp = num/i; sum += tmp; num -= (tmp*i); } System.out.print(sum);..

    [SWEA] 1938. 아주 간단한 계산기

    문제 두 개의 자연수를 입력받으면 그 두 수를 이용해 사칙연산(덧셈, 뺄셈, 곱셈, 나눗셈)을 한다. 입력: 두 개의 자연수 출력: 덧셈(+) 결과, 뺄셈(-) 결과, 곱셈(*) 결과, 나눗셈(/) 결과(몫만) 풀이 import java.util.Scanner; import java.io.FileInputStream; class Solution { public static void main(String args[]) throws Exception { Scanner sc = new Scanner(System.in); int a,b; a = sc.nextInt(); b = sc.nextInt(); System.out.println(a+b); System.out.println(a-b); System.out.p..

    [SWEA] 2046. 스탬프 찍기

    문제 사용자로부터 숫자(정수)를 입력받고 그 개수만큼 스탬프(#)를 찍는다. 입력: 정수 출력: 정수만큼 # 풀이 import java.util.Scanner; import java.io.FileInputStream; class Solution { public static void main(String args[]) throws Exception { Scanner sc = new Scanner(System.in); int stamp = sc.nextInt(); for(int i=0;i

    [HackCTF] RTL core

    check - 32bit - NX - 라이브러리 파일이 문제파일과 함께 주어졌다. Analyze pseudo code - main 함수 중 0x1c byte만큼 할당되어 있는 문자열 s에 gets함수를 통해 사용자로부터 입력받는다. - 사용자로부터 입력받은 password를 check_passcode에 인자로 전달하고 리턴되는 값이 hashcode와 같으면 어떤 문자열을 출력하고 core()함수로 연결된다. - main함수에서 매개변수 a1의 자리에 &s를 전달했다. 즉, 입력한 passcode의 주소를 전달한 것이다. for문에서는 passcode의 주소를 4씩 끊어 값을 참조하고 더하는 연산을 반복한다. AAAABBBBCCCCDDDD를 passcode로 입력해봤다. 이런식으로 AAAA(0x414141..

    [HackCTF] Random Key

    check - 64 bit - NX Analyze pseudo code - random 변수 v5를 생성하고 일반 변수 v4의 값을 입력한 후 v4가 v5와 값이 같으면 플래그를 출력한다. 실행 >> rand 함수에 대한 이해가 필요한 문제이다. - rand 함수 int rand(void) :랜덤한 숫자를 반환하는 함수로, stdlib.h 헤더파일에 포함되는 함수이다. 하지만, srand함수와 time 함수 없이 rand 함수만 사용하게 되면 일정한 순서의 숫자들이 반환된다. - srand 함수 void srand(unsigned int seed) : 매개변수로 전달되는 seed를 이용해 rand 함수에 사용될 수를 초기화한다. 즉, seed 값에 의해 rand 함수의 결과값이 달라지는 것이다. - ti..

    [HackCTF] 1996

    check - 64bit - NX Analyze pseudo code 실행 - 환경변수를 입력하면 환경변수의 값을 출력해준다. - 환경변수를 입력받을 때 name 변수에 저장하는 듯 하다. name 변수는 0x410 byte만큼 할당되어 있고, 길이제한 없이 값을 입력받는다. - 입력받은 이름(값)을 getenv 함수를 통해 찾아낸다. Exploit from pwn import * p = remote("ctf.j0n9hyun.xyz", 3013) pl = "A"*(0x410 + 8) pl += p64(0x400897) p.sendline(pl) p.interactive() C++라서 이해가 잘 안되는 코드들이 많았지만,,, 실행해보면서 대충 어떤 식으로 payload를 짜면 될 지 감이 왔고 겁먹은 만큼..

    [HackCTF] g++ pwn

    check - 32 bit - NX Analyze pseudo code C++ 코드로 되어 있어서 우선 익숙하지 않아 해석하는게 가장 문제다.. - s 에 0x3c (=60)byte만큼 할당하고 fgets함수를 통해 32byte만큼 읽어들인다. 이 때에는 길이 제한이 생겨 버퍼오버플로우를 일으킬 수 없다. - 정확히 코드들을 해석하기는 어렵지만,, 실행결과를 참고해서 보면 "I"를 입력하면 s의 내용이 저장된 input변수에 "I"를 저장하고 이를 v1에 저장하면서 you를 대신 저장하여 문자열 s에 복사하고 문자열을 출력한다. >> 입력할 때에는 32byte라는 길이제한이 있었지만 strcpy함수를 사용할 때는 길이제한을 두지 않았기 때문에 복사하면서 오버플로우 시킬 수 있다. 실행 - "I"를 입력했..

    [SWEA] 2047. 신문 헤드라인

    문제 주어진 문장 중 소문자를 모두 대문자로 만들어 신문의 헤드라인으로 만들어야한다. 입력: 문자열 (단, 80byte 이하로 제한) 출력: 문자열 (대문자로 변환) 풀이 import java.util.Scanner; import java.io.FileInputStream; class Solution { public static void main(String args[]) throws Exception { Scanner sc = new Scanner(System.in); String line = sc.next(); System.out.println(line.toUpperCase()); sc.close(); } } - String toUpperCase() 소문자를 대문자로 바꿔주는 메소드로, String ..