본문 바로가기

전체 글

(123)
[JAVA 백준] 10817. 세 수 세 정수 A, B, C가 주어진다. 이때, 두 번째로 큰 정수를 출력하는 프로그램을 작성하시오. 문제는 매우 간단하지만 새롭게 알게 된 게 있으면 공부가 되는 거니까 문제를 풀다가 입력받은 int 를 배열에 넣는 더 효율적인 소스를 알게되어서 같이 작성해보려고 한다. 먼저 내 소스는 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); sc.close(); //sc.close()를 통해 메모리 사용량을 줄일 수 있다. int[] ar..
[JAVA] level1. 같은 숫자는 싫어 이 문제를 풀고 나서 더 간단한 다른 풀이를 찾다가 추상클래스와 인터페이스, ArrayList, ListIterator 까지 많은 것을 공부하고왔다. 2019/11/20 - [자바/기본 개념] - List와 ArrayList / ArrayList와 Array 2019/11/20 - [자바/기본 개념] - 추상클래스와 인터페이스 / 상속과 다형성 우선 문제는 간단하다. 배열 arr 가 주어지는데, 연속으로 중복된 element 는 하나만 남기고 전부 제거해 배열 answer 에 넣으면 끝! arr = [1,1,3,3,0,1,1] 이면, answer = [1,3,0,1] 이 될 것이고, arr = [4,4,4,3,3] 이면, answer = [4,3] 이 될 것이다. public class solution ..
[JAVA] Iterator와 ListIterator * Iterator : 컬렉션 인터페이스중 하나, 메소드 기능 boolean hasNext() 읽어올 element 가 있으면 true 반환 Object next() 다음 element 읽어오기 next() 호출 전 hasNext()로 읽어올 element 가 있는지 확인하는게 안전 void remove() next() 로 읽어온 element 삭제 List list = new ArrayList(); Iterator it = list.iterator(); while(it.hasNext()) { System.out.println(it.next()); } * ListIterator : Iterator를 상속받아 기능을 추가한 것, 컬렉션의 요소에 접근할 때 Iterator는 단방향으로만 이동이 가능하지만, ..
[JAVA] List와 ArrayList / ArrayList와 Array 우선 ArrayList 는 클래스이고, List 는 인터페이스라는 점에서 차이가 있다. 클래스인 ArrayList 를 사용해서 생성 시점에 List 외에도 RandomAccess,Serializable 인터페이스 등을 구현할 수 있는 것이다. 클래스 와 인터페이스에 대해서는 이전 게시글을 참고! 2019/11/20 - [자바/기본 개념] - 추상클래스와 인터페이스 / 상속과 다형성 만약, 이렇게 선언을 했다면 List list = new ArrayList(); ArrayList list = new ArrayList(); List는 인터페이스이므로 도형에 비유할 수 있고, ArrayList 는 클래스이므로 정사각형이라고 비유할 수 있다. 그렇다면 ArrayList 는 그냥 배열 Array와 비교했을 때 어..
[JAVA] 추상클래스와 인터페이스 / 상속과 다형성 1) 클래스는 크게 일반 클래스와 추상 클래스로 구분, 그 중 추상 클래스 : 클래스 내 '추상 메소드' 가 하나 이상 포함되거나 abstract로 정의된 경우 : 여러 메소드가 존재, 따라서 그대로 가져다 쓰거나, 오버라이드 하거나, abstract 가 붙은 메소드만 반드시 구현해주면 되는 게 추상 클래스 2) 인터페이스는 모든 메소드가 추상 메소드인 경우 : 미리 이런 메소드들을 사용할 것이라고 인터페이스에 선언해두고, 상속 시 안에 선언된 모든 메소드들을 구현하면 되는게 인터페이스 -> 결국 둘 다 상속 받은 자식이 반드시 구현을 하도록 만들 때 사용 -> 스스로 new 로 객체 생성이 불가능 한마디로 둘의 차이는 ? 추상 클래스는 클래스를 상속 받아 기능을 이용 및 확장, -> 상속 (Inheri..
[Toddler's Bottle] 4번 flag ls 로 flag 하나 있는 것 확인 후 cat, 난독화가 되어 있고, UPX 라는 문자열을 통해 UPX 패커로 패킹되어 있음을 알 수 있었다. 따라서 언패킹 후 다시 확인해보기로 했다. upx -d 명령어로 언패킹 후 다시 cat, 우선 스트링이 잘 보이는 것을 보아 언패킹이 잘 되었음을 확인 후 실행 시켜보기로 했다. 권한 부여 후 실행, malloc()후 flag와 strcpy 한다는 문구가 출력된다. 따라서 디버깅을 해보았다. #0x6c2070 가 눈에 띈다. 그래서 해당 주소 메모리를 확인해봤다. 해당 주소가 0x00496628에 있음을 확인한 후, x/x로 출력해봤는데 헥사로 나오는걸 보고 string 으로 다시 출력해보았다. flag 획득 + 참고 + 구글링을 해보니까 IDA 를 사용하면 디..
[Toddler's Bottle] 3번 bof 그냥 접속 시 Nah 출력되는 것을 확인하고 파일 다운로드 후 cat bof.c 으로 소스 먼저 확인해봤다. 32바이트 배열에 문자열을 입력 받고 ‘0xdeadbeef’와 ‘0xcafebabe’가 같으면 쉘을 획득할 수 있는 것 같다. 이때 gets() 를 사용해서 입력 버퍼 크기를 넘어서서 문자열을 입력 받을 수 있게 하는 것을 보아 bof 시켜 해결하는 문제임을 예측할 수 있었다. 따라서 bof 에 실행 권한 부여 후 gdb로 배열과 key 사이가 몇 바이트인지 확인해보기로 했다. main 0xdeadbeef 넣는 것 확인, func 까지 보고, 문제 해결 방법에는 크게 2가지가 있을 것 같다고 생각했다. 방법1. gdb 만 보고 스택 그린 후 오버플로우 시킬 바이트 판단하기 * lea : 주소 불러..
[Toddler's Bottle] 2번 collision 2번 문제를 풀어보자. 1번 fd 와 마찬가지로 ls하면 col.c 파일이 보인다. col.c 를 확인해본다. 살펴보면 hashcode인 0x21DD09EC 와 길이가 20byte인 입력 인자가 같으면 flag 가 출력될 것으로 보인다. check_password 함수를 살펴보면 char포인터를 int 포인터로 변환, for 문은 5번 반복 (4바이트씩 끊어 res에 추가)하는 것을 볼 수 있다. 따라서 계산기를 이용해 계산해보면 0x21DD09EC / 5 = 0x6c5cec8 , 나머지 확인을 위해 다시*5 하면 0x21DD09E8로, 0x4 부족 -> 마지막에 +4 필요 *주의: char형 이int형으로 변환될 때에는 리틀 엔디언 형식으로 변환 6c5cec8 * 4 + 6c5cecc -> \xc8\x..