'gravity-free'에 해당되는 글 49건

  1. 2012.04.19 isthisfilesafe
  2. 2012.04.03 잡다한 tools
  3. 2012.03.23 asm pt2
  4. 2012.01.03 lib
  5. 2011.12.02 Web browser
  6. 2011.09.29 nslookup
  7. 2011.09.08 Password cracker
  8. 2011.07.19 webshell pt2
  9. 2011.03.23 gdb-2
  10. 2011.03.22 gdb-1

isthisfilesafe

gravity-free/isthisfilesafe 2012. 4. 19. 10:56


What is this exe file? Is this file safe? Check the directory

http://www.isthisfilesafe.com


:

잡다한 tools

gravity-free/tools 2012. 4. 3. 15:20

'gravity-free > tools' 카테고리의 다른 글

crackinn  (0) 2012.07.11
:

asm pt2

gravity-free/assembly 2012. 3. 23. 14:12
데이터 타입 :

 타입 설 명
 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으로 데이터를 복사한다.
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

조건 점프 명령
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

---------------------------------------------------------------------------------------------------------

1. 데이터 이동 :

어셈블리에서 데이터를 옮기고자 할때는 MOV 명령어를 사용한다.

MOV [복사될 곳], [읽어들일 곳]

MOV EAX, EBX의 경우 EBX 레지스터를 EAX에 대입한다.
MOV EAX, [EBX]로 표현되어 있는 경우에는 EBX가 가리키는 값을 EAX에 대입한다.
MOV EAX, [EBP+10]의 경우 EBP의 주소에서 20만큼 증가한 주소지의 값을 EAX에 대입한다
MOV EAX, [EBP-10]의 경우 EBP의 주소에서 20만큼 감소한 주소지의 값을 EAX에 대입한다
[EBP+10]과 [EBP-10]의 경우에 함수 내부에 존재하는 명령이었다면 EBP를 기준으로 10 증가된 경우에는 파라미터로 넘어오는 값일 수 있고, 10 감소한 경우에는 함수 내부에서 쓰이는 지역변수일 수 있다.
LEA EAX, [EBP+10] 명령의 경우 EBP 주소에서 10만큼의 주소지를 더한 값이 아니라 EBP의 주소지 값에서 10을 더한 값을 EAX로 대입한다.



2. 전역변수 :

전역변수의 경우 data 섹션에 저장이 되고, 프로그램을 초기화하는 과정에서 세팅되거나 실행중에 변경이 될 수도 있다. 예를 들어 문자열이 참조되는 방법은

.data:0088A1A1  'This Program is powerful' , 0

data 섹션의 문자열이 이렇게 존재하면

.text:006A2A22 mov eax, 0x88A1A1h
.text:006A2A27 retn



3. 비교구문 cmp, test :

cmp 명령어는 주어지는 두 값을 뺄셈을 하여 처리하고, test 명령어는 주어지는 두 값을 논리적 AND 연산해서 처리하는 점이 다르며, 두 명령어가 조건 분기문을 결정하기 위해서 사용된다는 점은 같다.

cmp eax, ebx는 두 값을 뺴서 0이면 참(같은 값)이 되는 형태이다.

test 연산은 보통 호출된 함수들이 일반적으로 리턴값을 EAX 레지스터에 저장하는 것을 이용하여, 다음과 같이 사용된다.

CALL function
TEST eax, eax
JZ 주소지

함수를 call하고, 함수의 리턴값으로 EAX값이 세팅되면, 비교를 하는 것이다.

cmp가 영향을 미치는 플래그들은 ZF, OF, SF, CF이고 만약 ZF 플래그가 ZF=1로 세팅되었다면 주어진 두 값이 같았다는 것을 의미한다.
그 외에 같지 않았을 경우에는 OF, SF, CF를 이용해서 어느 쪽이 더 큰지를 알 수 있다.

test가 영향을 미치는 플래그는 SF, ZF, PF가 이고, test 명령어는 같은 피연산자를 가지게 되는데 그러므로 중요한것은 피연산자가 0이냐, 0이 아니냐하는 것이다. 0이면 ZF가 1로 세트되고, 0이 아니면 ZF가 0으로 세트된다.



4. 분기문의 사용 :

분기문은 일반적으로 점프 구문을 이야기하며, if문을 어떻게 사용하는지에 따라서 달라지는 어셈코드들을 살펴보겠다.

if 조건문은 if(rsult == 0)라면 다음과 같이 변경된다.

cmp dword ptr [ebp-4], 1
jne 00401234

cmp로 비교를 한 후에 점프 구문이 된다.


시언어 소스
if(변수==0){
          if문 내의 함수 호출
}
이후 동작

어셈블리어 변환
mov eax, 변수값
test eax, eax
jnz 이후 동작
if문 내의 함수 호출

if에서 사용되는 변수를 먼저 mov로 값을 대입하고, test로 비교(즉 eax값이 0이냐 0이 아니냐를 판단)를 한 다음에 JNZ를 이용하여 이후 동작을 할지 if문 내부의 함수를 호출할지를 결정한다. 이외에 if문은 if 다음에 else 구문이 여러 번 더 나타날 수 있다는 점을 고려해서 비슷한 방식으로 분석하면된다.



5. 반복문의 사용 :

같은 내용이 반복되어 처리되다가 반복문을 종료하는 비교문을 만나서 점프하여 반복문을 벗어나도록 구현 있다.

loop :
      mov al, [ecx]
      mov [edx], al
      inc ecx
      inc edx
      cmp al, 'c'
      jnz short loop

ECX와 EDX는 메모리상의 문자열을 지칭하는 포인터이고, ECX가 가리키는 문자열에서 EDX가 가리키는 문자열로 복사가 일어나고 있다다. 반복을 할 때마다 포인터가 둘 다 1씩 증가되고, 'c'문자열이 나타날 때까지 복사를 하는 것으로 생각할 수 있다.


for 반복문은 for(int i = 1 ; i<= param ; i++)이라면
mov dword ptr [ebp-8], 1        //  i 변수 = 1
jmp 004017FF
mov eax, dword ptr [ebp-8]    //  i 변수를 eax에 대입
add eax, 1                             //  eax + 1
mov dword ptr [ebp-8], eax    //  eax + 1을 i에 대입       
mov ecx, dword ptr [ebp-8]    //  ecx로 카운팅을 한다.
cmp ecx, dword ptr [ebp+8]    //  종료인지 체크
jg 00401812

어셈블리코드를 보면 i 변수의 값이 변경되고, 반복하면서 카운팅을 하는 것을 알 수 있다.
그리고 카운팅을 하는 변수가 반복 횟수를 초과했는지를 cmp로 검사해서 반복 구문을 빠져나온다.



6. 함수의 사용 :

함수는 시작하는 부분과 끝나는 부분을 파악할 수 있는 구분자가 있어서 확인이 어렵지 않다. 시작하는 부분의 코드를 보자.

push ebp
mov ebp, esp
sub esp, 20

EBP값은 스택에 넣어두고, 현재 ESP값을 EBP에 대입하고, 지역변수를 만들 공간을 확보하기 위해서 ESP값을 변경한다.
그리고 끝나는 부분은 호출이 끝나서 리턴되기 때문에 RET가 쓰이게 된다.

mov eax, -1
mov esp, ebp
pop ebp
ret

이와 같이 ESP는 원래 값으로 돌아가고, EBP는 저장되었던 값으로 복구된다. 그런 후에 RET를 이요하여 함수를 CALL했던 부분으로 다시 돌아간다. 그리고 eax에 -1을 넣어서 결과가 -1임을 표현해주기도 한다.

출처 : asmlove.co.kr // dakuo.tistory.com/7,8
 

'gravity-free > assembly' 카테고리의 다른 글

ARM asm  (1) 2012.06.25
assembly  (0) 2011.01.04
:

lib

gravity-free/lib 2012. 1. 3. 12:42
:

Web browser

gravity-free/browser 2011. 12. 2. 14:30
:

nslookup

gravity-free/nslookup 2011. 9. 29. 17:26
nslookup all
:

Password cracker

gravity-free/password cracker 2011. 9. 8. 15:05
Biggest MD5 crack databases 

-----------------------------------------------------------------
MOST BIGGEST SITE OF MD5 DECRYPING
-----------------------------------------------------------------

http://www.hash-cracker.com (40,000,000)

http://www.cmd5.com/english.aspx (457,354,352,282)

http://www.md5crack.com

http://www.hashchecker.com

http://md5cracker.tk/ (MD5 Search engine by searches a total of 14 on-line crackers.)

http://www.md5decrypter.com (5,889,729)

http://md5.rednoize.com (56,502,235)

http://www.tmto.org/?category=main&page=search_md5 (306.000.000.000)

http://www.milw0rm.com/cracker/insert.php (Milw0rm Cracker db)

http://blacklight.gotdns.org/cracker/crack.php (2,456,288)

http://www.shell-storm.org/md5 ( The data base currently contains 169582 passwords )

http://md5.xpzone.de (Need Account)

http://passcracking.com/ (Register to increase your priority)

http://www.xmd5.org

Perl Script: MD5 Brute Forcer

-----------------------------------------------------------------
CRACKED PASSWORD LIST
-----------------------------------------------------------------
http://www.md5oogle.com/md5hashes.php
http://www.hashchecker.com/?_sls=hash_list&_from=1
http://www.milw0rm.com/cracker/list.php
http://darkc0de.com/database/cracked.txt

-----------------------------------------------------------------
RAINBOW TABLE
-----------------------------------------------------------------
http://www.freerainbowtables.com/en/download/
http://www.rainbowtables.net/


:

webshell pt2

gravity-free/webshell 2011. 7. 19. 18:41

'gravity-free > webshell' 카테고리의 다른 글

webshell.io  (0) 2014.12.19
webShell site  (0) 2010.08.29
각 웹쉘 소스  (0) 2010.07.05
:

gdb-2

gravity-free/gdb 2011. 3. 23. 11:31

- gdb 실행

$ gdb 프로그램명
or
$ gdb 프로그램명 실행중인프로세스ID



- gdb 종료

(gdb) q
or
(gdb) [Ctrl]+d



- 소스 출력

main 함수를 기점으로 소스 내용 출력
(gdb) l
or
(gdb) list

이전 행을 출력
(gdb) l-

5행의 소스를 출력
(gdb) l 5

함수의 소스를 출력
(gdb) l 함수명

특정 소스파일의 몇번째 행을 기준으로 출력
(gdb) l 소스파일명:53

특정 소스파일의 특정 함수를 기준으로 출력
(gdb) l 소스파일명:함수명

한 번에 표시되는 라인 수 설정
set listsize 라인수



- 프로그램 실행

(gdb) r

- 브레이크 포인트
특정 함수에 설정
(gdb) b 함수명

특정 행에 설정
(gdb) b 라인수

현재 행에서 몇번째 이후 라인에 설정
(gdb) b +라인수

현재 행에서 몇번째 이전 라인에 설정
(gdb) b -라인수

특정 파일의 특정 함수에 설정
(gdb) b 파일명:함수명

특정 파일의 특정 라인에 설정
(gdb) b 파일명:라인수

특정 주소에 설정
(gdb) b *0x12345678       (주소)

조건으로 브레이크 설정
if
(gdb) b 98 if 변수명 조건
예) (gdb) b 98 if nCnt == 0

condition
(gdb) condition 행번호 변수명 조건
예) (gdb) condition 32 lineCnt == 10

1회만 브레이크
(gdb) cl 함수명
(gdb) cl 행번호
(gdb) cl 파일명:함수명
(gdb) cl 파일명:행번호

모든 브레이크 삭제
(gdb) d

브레이크 포인트 정보 보기
(gdb) info b
or
(gdb) info breakpoints

브레이크 포인트 온/오프
비활성화
(gdb) disable 포인트번호(info b에서의 번호)

활성화
(gdb) enable 포인트번호



- 프로그램 실행

실행
(gdb) r

인자 지정하여 실행
(gdb) r 인자1 인자2....



- 진행 명령어


스택 백트레이스(콜 스택)
(gdb) bt

step (함수 호출 내부까지 들어감)
(gdb) s

step을 반복
(gdb) s 반복횟수

현재 행 수행 후 정지,
(gdb) n

n을 반복
(gdb) n 반복횟수

다음 브레이크 포인트까지 쭉~ 진행
(gdb) c

현재 진행중인 함수가 끝난 시점으로 진행
(gdb) finish

함수 진행중 빠져나오기
(gdb) return 리턴값

현재 루프를 빠져나가기
(gdb) u

인스트럭션 단위로 수행(함수 내부까지)
(gdb) si

인스트럭션 단위로 수행
(gdb) ni



- 변수 값 보기

와치
(gdb) watch 변수명

지역변수들
(gdb) info locals

전역변수들
(gdb) info variables

변수 개별로 보기
(gdb) p 변수명

함수의 주소 값 보기
(gdb) p 함수명

포인트 변수 보기
(gdb) p *변수명         (c에서 포인터의 값 참조와 유사.. 이중 포인터는 p **변수명...)

레지스트 값 보기
(gdb) p $레지스트리명

레지스트 값 전체 보기
(gdb) info all-registers

구조체 배열 보기
(gdb) p *구조체명@배열수

특정 함수의 static 변수 값 보기
(gdb) p 함수명::변수명

전역 변수 값 보기
(gdb) p 파일명::변수명

출력 형식 지정
16진수
(gdb) p /x 변수명

2진수
(gdb) p /t 변수명

8진수
(gdb) p /o 변수명

부호 있는 10진수
(gdb) p /d

부호 없는 10진수
(gdb) p /u

최초 1바이트를 문자열로
(gdb) p /c 변수명

부동 소수점 값
(gdb) p /f 변수명

가장 가까운 심볼의 오프셋
(gdb) p /a 변수명


 
- 프로그램 종료

(gdb) k

출처 : http://busang.egloos.com/117416

'gravity-free > gdb' 카테고리의 다른 글

gdb-3  (0) 2012.07.02
gdb-1  (0) 2011.03.22
:

gdb-1

gravity-free/gdb 2011. 3. 22. 21:32

gdb(1)                      GNU Tools                      gdb(1)


이름
       gdb - GNU 디버거

개요
       gdb    [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps]
              [-tty=dev] [-s symfile] [-e prog] [-se prog] [-c
              core] [-x cmds] [-d dir] [prog[core|procID]]

설명
       GDB같은 디버거의 목적은 다른 프로그램 수행중에 그 프로그램
       ``내부에서'' 무슨 일이 일어나고 있는지 보여주거나 프로그램이
       고장났을 때 무슨 일이 일어나고 있는지 보여주는 것이다.

       버그를 잡는 걸 돕기위해 GDB는 네가지 종류의 일(더 많은 일을
       할 수 있다)을 할 수 있다:


          �   프로그램의 행동에 영향을 줄 수 있는 각종 조건을 설정한 후,
              프로그램을 시작한다.


          �   특정 조건을 만나면 프로그램을 정지시킨다.


          �   프로그램이 정지됐을 때 무슨 일이 일어났는지 검사한다.


          �   프로그램 내부 설정을 바꾸어서 버그를 수정함으로써 다른
              버그를 계속 찾아나간다.


       GDB로 C, C++, Modula-2로 짠 프로그램을 디버그할 수 있다.
       GNU 포트란이 완성되면 포트란도 지원할 것이다.

       쉘 명령어 gdb로 GDB를 기동한다.  일단 시작되면,
       GDB 명령 quit으로 종료명령을 주기전까지는 터미날로부터
       명령을 읽어들인다.  help 명령을 사용하여 gdb 내부에서
       온라인 도움말을 볼 수 있다.

       인자나 옵션 없이 gdb를 기동할 수 있다; 하지만 가장 일반적인
       GDB 기동방법은 하나 또는 두개의 실행가능 프로그램명을 인자로
       주는 것이다:

       gdb program


       실행가능 프로그램명과 core 파일을 동시에 인자로 주어 기동할
       수도 있다:

       gdb program core




       실행중인 프로세스를 디버그할려면 대신 프로세스 ID를 두번째
       인자로 주면된다:

       gdb program 1234


       명령은 GDB를 (`1234'란 이름의 파일이 없다면) 프로세스 1234에
       접속시킨다(GDB는 core 파일을 먼저 찾는다).

       다음은 가장 많이 사용되는 GDB 명령들이다:

       list : source file 10줄을 화면에 표시해주며 enter를 누르면 다음을 계속 보여준다.

       run(r) : 프로그램을 실행하는데 break point가 있다면 그 지점에서 멈춘다.

       break(b) : 프로그램 실행을 일시 중단하는 위치를 지정한다.

       clear : 특정 라인이나 함수에 있던 break point를 삭제

       delete : 몇몇 정지점이나 자동으로 출력되는 표현을 삭제

       next(n) : 다음 행을 수행. sub routine이 있다면 이를 호출해서 계속 수행한다.
                 하지만 subroutine으로 들어가지는 않는다. 호출이 없다면 next와 같음.
                 next n은 n번 수행하라는 의미
                 (그 행에서 호출되는 함수를 수행하지않고 건너뛴다)

       step(s) : 한 줄씩 실행함. sub routine이 있다면 내부로 들어가서 한 줄씩 실행함
                 (그 행에서 호출되는 함수를 수행)

       up : 현재 함수를 호출한 함수를 표시한다.

       down : 현재 함수가 호출하는 함수를 표시한다.

       print expr : expr 내용을 화면에 표시한다.

       display : 현재 display된 명령의 목록을 보여준다.

       bt : backtrace의 약자로 프로그램의 스택을 보여줌

       kill : 디버깅 중인 프로그램 실행을 취소

       file programName : programName 파일을 디버깅할 프로그램으로 사용한다.

       cont : continue의 약자로 현재 위치에서 프로그램을 계속 실행한다.

       help : 명령에 대한 정보를 보여주거나 일반적인 정보를 보여준다.

       finish : 선택된 스택 프레임이 리턴될 때까지 수행함. 리턴되는 값은 출력되고 히스토리에 입력됨

       info : 특정 명령에 대한 정보를 표시한다. 예를 들어 만들어놓은 break point를 보기를 원한다면
              info b 혹은 info break 라고 치면 됨
      
       print expr : 수식의 값을 보여준다.

       c      (정지점등에서 정지한) 프로그램을 계속 수행한다.

       next   (정지한 후) 다음 행을 수행한다; 그 행에서 호출되는
              함수를 수행하지않고 건너뛴다.

       step   (정지한 후) 다음 행을 수행한다; 그 행에서 호출되는
              함수를 수행한다.

       help [name]
              GDB 명령어 name에 대한 정보를 보여거나 GDB 사용에 관한
              일반적인 정보를 보여준다.

       quit   GDB에서 빠져나간다.

       GDB에 대한 상세한 정보를 알고싶으면 Richard M. Stallman과
       Roland H. Pesch가 쓴 Using GDB: A Guide to the GNU
       Source-Level  Debugger를 보라.  동일한 내용이 info의
       gdb 항목에 나온다.

옵션
       옵션 이외의 모든 인자는 실행가능 파일과 core 파일(또는 프로세스 ID)로
       인식된다; 즉 옵션 플래그 없는 첫번째 인자는 `-se' 옵션과 같고,
       두번째 인자는, 존재한다면, `-c' 옵션과 같다(인자가 파일이름인 경우).
       많은 옵션에 짧은 형식과 긴 형식이 있는데; 둘다 아래에 설명된다.
       긴 옵션은 일부만 써도 애매하지 않으면  인식된다. (당신이 그렇게
       하고싶다면, `-'대신 `+'로 옵션을 나타낼 수도 있다. 우린 일반적 관례인
       -를 쓰겠다)



       모든 옵션과 명령행 인자들은 순차적으로 처리된다.  `-x'옵션을
       사용할 경우 순서가 다르면 결과도 다르다.


       -help

       -h     모든 옵션을 짧은 설명과 함께 보여준다.


       -symbols=file

       -s file
               file로부터 심볼 테이블을 읽어들인다.


       -exec=file

       -e file
                적당하다면 실행파일로 file을 사용하여 core dump의
              내용을 검사한다.


       -se=file
               file로부터 심볼 테이블을 읽어들이고 또한 실행파일로 사용한다.


       -core=file

       -c file
               file을 검사할 core dump로 사용한다.


       -command=file

       -x file
               file안의 GDB 명령을 수행한다.


       -directory=directory

       -d directory
               소스 파일 검색 경로에 directory를 추가한다.


       -nx

       -n     초기화 파일 `.gdbinit'의 명령을
              수행하지않는다.  보통 모든 옵션과 인자가 처리된 후 초기화 파일의
              명령이 실행된다.



       -quiet

       -q     ``조용히해''.  도입 메시지와 저작권 메시지를 출력하지않는다.
              배치 모드에서도 이들 메시지는 출력되지않는다.


       -batch 배치 모드로 수행한다.  `-x' 옵션으로 지정한 파일(그리고 금지되지않았다면,
              `.gdbinit' 파일)의 명령들을 수행한 후 종료상태 0으로 종료한다.  파일의
              GDB 명령을 수행하던 중 오류가 발생하면 0이 아닌 종료상태로 종료한다.

              프로그램을 내려받아서 다른 컴퓨터에서 실행하는 경우등에, GDB를 필터로
              사용할 수 있는데 이때 배치 모드가 유용하다; 이 모드가 더 쓸모있도록,
              GDB하에서 수행되던 프로그램이 종료되면 나오는

              Program exited normally.

              이란 메시지가 배치 모드에서는 나오지 않는다.


       -cd=directory
                현재 디렉토리 대신 directory를 작업 디렉토리로 하여
              GDB를 수행한다.


       -fullname

       -f     이맥스의 서브프로세스로 GDB가 수행될 때 이 옵션이
              켜진다.  이 옵션이 켜지면 GDB는 전체 파일이름과 행번호를, 스택 프레임을
              디스플레이할 때마다(프로그램이 정지되는 경우도 여기에 해당된다)
              표준적이고 알아볼 수 있는 양식으로 출력한다.  이 양식은 ` 32'뒤에
              파일이름, 콜론으로 구분된 행번호와 문자위치, 개행문자가 오는 것이다.
              이맥스-GDB 접속프로그램은 ` 32'를 프레임의 소스코드를
              디스플레이하란 신호로 사용한다.


       -b bps  원격 디버깅에 사용되는 직렬 인터페이스의
              회선속도(보오율이나 초당 비트수)를 설정한다.


       -tty=device
               device를 표준입력과 표준출력으로 하여 프로그램을
              실행한다.



'gravity-free > gdb' 카테고리의 다른 글

gdb-3  (0) 2012.07.02
gdb-2  (0) 2011.03.23
: