bof 원정대의 skeleton을 잡아보자!

* 소스코드 분석


(skeleton.c)


skeleton의 소스코드를 보면 argc를 저장해 두었다가 넘어온 인자를 전부 0으로 초기화하는 코드가 눈에 띈다. 우리가 지금까지 했던 인자를 이용하는 건 못한다는 뜻이다.

gdb를 이용해 메모리를 확인해보겠다.



(gdb를 통한 실행)




(메모리 상태)


메모리를 보면 인자 데이터 영역이 모두 0으로 초기화 된 것을 확인할 수 있다...

그러다 맨 아래 스택 밑바닥에 가보니 뭔가가 있다?



(스택 밑바닥)


혹시?


(스택 밑바닥)


밑바닥을 확인해보니 프로그램 명(경로)가 적혀 있는 것을 확인 할 수 있었다.

그렇다면..! 링크를 이용하여 여기에 쉘코드를 올릴 수 있겠구나! 라는 생각이 들었다. :)

바로 링크를 만들어주기 위해 경로를 만들었다.



(경로 생성)



그 후 링크!


(링크 생성)



링크를 만들었다면 끝이다! Nop 코드도 충분히 넣었겠다! 이제 공격하면 된다.



(공격 성공)



쉘 획득!

'WarGame > 500 Project' 카테고리의 다른 글

(28/500) Lord of the BOF - darkknight  (0) 2017.06.20
(27/500) Lord of the BOF - golem  (0) 2017.06.20
(25/500) Lord of the BOF - vampire  (0) 2017.06.20
(24/500) Lord of the BOF - troll  (0) 2017.06.20
(23/500) Lord of the BOF - orge  (0) 2017.06.20

자바에서 컬렉션 프레임워크란
프로그래밍시 유용한 자료구조나 알고리즘을 클래스와 메서드로 정리해 둔것이다.

자료구조로는 대표적으로
배열, 리스트, 스택, 큐, 트리, 해시

알고리즘 몇가지로는
정렬, 탐색, 최대 최소검색이 있다.

리스트표현과 유용한 메서드들을 정리해둔 예를 보자.

(리스트 표현)


< > 표시는 어제 확인한 제네릭이다.
또 리스트는 배열로 만들 수 있고, 연결리스트(LinkedList)로 만들 수 있다.

위 코드는 배열을 이용한 리스트이다.
자세한 자료구조 내용은 언급하지 않겠다.
(필요시 검색해보면 많이 나온다.)




(리스트에 정수를 추가하는 코드)


보면 Integer Wrapper 클래스를 이용한다.


(get() 메서드)



리스트에서 제공하는 get 메서드는 () 괄호 안의 인덱스에 있는 데이터를 얻을 수 있다.




(결과 모습)


배열을 이용하지 않는
연결리스트 표현도 가능하다.

아래는 LinkedList 의 표현코드이다.



(연결리스트 코드)


위 코드를 보면
Iterator 라는 놈이 나왔다.
이 Iterator 라는 놈은 Interface이다.
반복하는 경우에 생성해서 이용하면 좋은 메서드들이 많다.

위 코드에서 보는 것처럼 .hasNext() 함수는 다음에 값이 있는지 확인하는 boolean 반환 메서드이고
next() 는 다음 값으로 넘어가는 함수이다.

*Hash Set
해쉬 알고리즘을 이용하는 집합단위이다.
먼저
코드를 보면




(HashSet 사용 코드)



(실행화면)



실행 화면에 보듯이 해쉬집합은
순서대로 입력되지 않는다.
순서는 신경쓰지않고 저장한다. 또 동일한 값은 저장하지 않는다.

해쉬에 관한 자세한 내용은 언급하지 않겠다.
(자료구조에 관한 내용은 알고있으리라 가정하고 넘어가겠습니다.)



(해쉬 집합)




(실행화면)



화면을 보면 중복된 데이터들은 빠져있는 것을 확인 할 수 있다.


자료구조 트리를 이용한 집합이 있다.
TreeSet이다.



(TreeSet 사용 코드)



(실행화면)



실행화면을 보면 값이 정렬되어 저장되어있음을 확인 할 수 있다.

오름차순인지 내림차순인지 기준은 각자 다르지만
확실한건 숫자의 크기로 순서가 정해져 있다는 것은 분명하다.

그러면 이 순서를 역순으로 하는 방법이 있을까?
-> 반복자 Iterator를 바꿔준다. ( descendingIterator() 함수로 )


(역순, 실행화면)



* TreeMap
Map이란 key-value 방식의 저장방법이다.
트리라는 자료구조로 저장한다. 즉, 크기비교하여 순서있게 저장한다.

아래는 사용 예시이다. 입력을 보면 key와 value가 들어가는 것을 확인할 수 있다.



(TreeMap 사용 코드)



(실행 화면)



실행 화면을 보면 트리의 특성처럼
순서가 있게 저장된것을 확인 할 수 있다.

* 전화번호관리 프로그램 07 단계

-> Ver 07에서는
이러한 프레임워크를 이용한다.
자료구조를 이용해 자료를 관리한다.
해쉬를 이용해 검색기능을 향상 시켰고, 중복된 값은 저장받지 않도록 향상했다.

캡쳐 화면은 다음 08단계에서 한번에 보이겠다.

(*참조 - 난 정말 JAVA를 공부한 적이 없다구요, 윤성우)



+ Recent posts