반응형

분류 전체보기 225

6단계 wolfman -> darkelf

이번 단계도 소스코드가 조금 더 추가되었다. 확인해보면 argv[1] 코드가 48byte를 초과하면 안 된다는 내용이다. 그러나 우리나 전 단계처럼 하면 딱 48byte만 사용하고 나머지는 argv[2]를 사용하면 된다. 이지~ argv[2]의 주소 값을 구하자. 여기서는 0xbffffc24를 사용하면 된다. argv[1] : dummy(44byte) + 0xbffffc24(4byte) argv[2] : \x90(100byte) + shellcode(25byte)

5단계 orc -> wolfman

전 단계 소스코드에서 하나 더 추가되었다. 이번에 추간된 소스코드는 버퍼를 0으로 초기화시켜 버퍼 안에서 쉘 코드를 실행하는 것을 막는 코드이다. 그러나 전 단계처럼 쉘코드를 argv[2]에 넣어하면 되므로 쉽게 풀 수 있다. argv[2] 주소를 찾아보자 주소는 대략 0xbffffc44를 사용하면 된다. argv[1] : dummy(44byte) + 0xbffffc44(4byte) argv[2] : \x90(100byte) + shellcode(25byte) 이렇게 넣어 exploit을 할 것이다. 성공~!

4단계 goblin -> orc

소스코드를 분석해보면 두 가지 코드가 더 추가되었다. 환경변수를 사용하지 못하게 모두 0으로 초기화하는 코드 RET 부분 스택에 무조건 '\xbf'로 시작하는지 확인하는 코드 할 수 있는 방안은 환경변수 영역을 안쓰고 RET 부분에 무조건 \xbf문자열을 넣는다는 것이다. 이번에도 아까처럼 argv[2]에 NOP+SHELL을 넣고 exploit을 해보겠다. 환경변수 영역이 아니니 상관이없고, argv[2]의 주소 값은 \xbf로 시작하니 두 조건에 다 만족하므로 exploit이 가능하다. argv[2] 주소 값을 찾아보자. 대략적으로 0xbffffc34를 사용하겠다. argv[1] : dummy(44byte) + 0xbffffc34 argv[2] : \x90(100byte) + shellcode(25by..

3단계 cobolt -> goblin

이번에도 버퍼 크기가 작고 함수만 gets으로 달라졌다. NOP+SHELL RET [4] SFP [4] Buffer [16] 이번에는 ret 위쪽 스택영역을 이용하여 exploit을 시도할 것이다. 첫 번째로 주소 값을 구해보자. 대략적으로 0xbffffb34를 사용하면 될 거 같다. dummy(20byte) + 0xbffffb34(4byte) + \x90(100byte) + 쉘 코드(25byte) 이렇게 하여 exploit을 해보자. [그림 1-3] exploit을 성공한 것을 볼 수 있다.

2단계 gremlin->cobolt

이번에는 소스코드를 보면 버퍼 크기가 너무 작다... 너무 작아서 쉘 코드도 다 들어가지 않는다. 버퍼를 이용하지 않고 매개변수 argv[2]를 이용하여 exploit을 수행할 것이다. gdb를 이용해 arg[2]의 주소 값 위치를 알아보자. 대략적으로 0xbffffc10로 잡으면 될 것 같다. 이제 준비는 끝났다. argv[1] = dummy (20byte) + 0xbffffc10 argv[2] = \x90 (100byte) + 쉘 코드 이렇게 exploit을 해보자. exploit을 성공한 것을 볼 수 있다.

1단계 gate -> gremlin

처음 어떤 파일이 있나 확인해보면, gremlin의 권한을 가지고 있는 실행 파일과 소스코드가 존재한다. gremlin.c 파일을 cat 명령어로 확인을 해보면 소스코드가 존재한다. 소스 코드를 분석해면 취약한 함수 strcpy()가 존재하는 것을 알 수 있다. 그렇다면 exploit이 가능하다. exploit 준비를 해보자. 첫 번째로 gdb 툴을 이용해 실제 스택 영역에 소스코드에 나온 데로 256byte를 사용하는지 확인해보자. 이렇게 어셈블리어를 확인해보면 실제 소스코드에 나와있는데로 256byte를 사용한다. 메모리 구조를 확인하면 RET [4] SFP [4] buffer [256] 이렇게 되어있다. 저기를 exploit 하기위해 총 260byte에 0x90과 쉘 코드를 넣고 ret에는 0x90..

SQL Injection (UNION)

UNION 연산자를 이용하여, UNION 연산자가 포함된 공격 쿼리를 주입하여 DB의 데이터를 획득한다. UNION은 둘 이상의 SELECT 문에서 검색된 레코드를 단일 집합으로 결합해주는 연산자다. UNION과 UNION ALL 이 존재한다. UNION은 중복을 제거한 결과의 합을 나타내고, UNION ALL은 중복을 포함한 결과의 합을 나타낸다. UNION 예제 select 'test' unison select 'good'; 결과 test ----- test good UNION 문법 SELECT... UNION [ALL | DISTINCT] SELECT... [UNION [ALL | DISTINCT] SELECT...] UNION 연산자는 두 개의 SELECT문 사이에 위치하며 데이터 형만 호환된다면..

Ethernet 헤더

Ethernet 헤더는 제일 낮은 계층의 프로토콜. 0 1 2 3 Destination Address Destination Address Source Address Source Address Ethernet Type X Ethernet 헤더는 도착지 MAC 주소가 6바이트, 출발지 MAC 주소가 6바이트 그리고 어떤 프로토콜의 데이터를 운반하는지 Ethernet Type 2바이트 필드로, 총 14바이트로 구성된다. Ethernet Type은 리눅스 환경에서 /usr/include/net/ethernet.h 파일에 정의되어있다.

SQL Injection

SQL Injection 웹 페이지의 입력 또는 매개변수인 파라미터의 값에 SQL 쿼리를 주입하여 데이터베이스의 데이터 조작이 가능한 웹 해킹 기법 중 하나이다. 이 취약점은 데이터베이스와 웹 애플리케이션이 연동되면서 태생되었으며 허용된 권한, 기능, 실행 가능한 SQL 쿼리에 의해서 피해 정도가 가늠되는 취약점이다. SQL Query 이 취약점은 DB의 데이터를 질의하기 위한 SQL 쿼리가 핵심 공격 기술에 해당되고, SQL 쿼리 구문 구현 능력이 공격 능력을 좌우한다고 할 수 있다. SQL은 데이터베이스로부터 정보를 얻거나 갱신하기 위한 표준 대화식 프로그래밍 언어이다. 데이터 조작어(DML) : 스키마 객체 내에서 데이터를 관리한다. ex) select, insert, update, delete 등..

체크섬(Checksum)

체크섬은 전송되는 헤더 및 데이터의 무결성을 보장하기 위해서 사용되며, 기본적으로 데이터의 합으로 계산된다. 통신 프로토콜에서 헤더 및 운반 중인 데이터에 오류가 발생하지 않았는지 확인하는 일반적인 방법은 바로 체크섬을 이용한다. 1. 데이터를 전송할 때 송신 측에서는 체크섬 값을 계산하고 이 값을 데이터와 함께 전송한다. 2. 데이터를 받는 수신 측에서는 송신 측에서 체크섬을 계산할 때와 동일한 알고리즘으로 체크섬을 계산한다. 3. 만약 데이터를 수신하는 쪽에서 계산된 체크섬 값과 수신된 체크섬 값이 서로 다른 값이 나오면 에러가 발생한 사실을 확인할 수 있다. 수신 측에서 데이터를 수신할 때 체크섬 계산 결과가 일치하지 않는다면 해당 패킷은 폐기되기 때문에 패킷을 전송할 때 정확한 체크섬 계산은 패킷..

반응형