리눅스 환경에서는 ctrl + v를 사용하면 다른 명령이 수행되는 경우가 많다.

 

shift + ctrl + v 를 사용하면 윈도우 환경에서의 붙여넣기처럼 사용가능하다.

'Linux > Linux 명령어' 카테고리의 다른 글

netstat 명령어  (0) 2020.10.23
strings 명령어  (0) 2020.10.06
man 명령어  (0) 2020.10.05
objdump 명령어  (0) 2020.10.05
Linux) file 명령어  (0) 2020.10.05

ld -I/lib/ld-linux.so.2 명령

 

 

-> ld-linux 패키지 설치(CentOS만 해당되는 것으로 추정.)

 

 

ld, ld.so

링크 편집기, 동적 링크 편집기.

 

ld.so 는 dynamic linker / loader로

/lib/*.so 나 /usr/lib/*.so 등의 shared object를 끌어오는 역할을 한다.

 

 

 

 

ld를 사용한 링킹

 

-l : 링킹 될 라이브러리 지정

 

e.g> test 바이너리에 fl 라이브러리 포함

$ ld -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o main.o funcs.o -lc -lfl

objdump -d 오브젝트 파일을 디스어셈블하여 출력해준다.

 

objdump

 

objdump GNU 바이너리 유틸리티의 일부로서, 라이브러리, 컴파일된 오브젝트 모듈, 공유 오브젝트 파일, 독립 실행파일등의 바이너리 파일들의 정보를 보여주는 프로그램이다. objdump ELF 파일을 어셈블리어로 보여주는 역어셈블러로 사용될 수 있다.

 

예를 들자면 오브젝트 파일을 역어셈블 하기 위해서 아래와 같이 쓴다:

objdump -Dslx file

 

objdump는 오브젝트 파일들의 내용을 읽을때 BFD 라이브러리를 사용한다. readelf(GNU Binutils에 역시 포함되어 있다.)는 objdump처럼 ELF 파일들을 읽을 수 있지만 BFD 라이브러리를 사용하지 않는다.

GNU 프로젝트는 높은 기능을 갖춘 objdump 프로그램을 GNU Binutils 패키지에 포함시키고 있다.

 

출력 예제

$ objdump -D -M intel file.bin | grep main.: -A20

 

4004ed: 55                                         push rbp 
4004ee: 48 89 e5                                mov rbp,rsp 
4004f1: c7 45 ec 00 00 00 00             mov DWORD PTR [rbp-0x14],0x0 
4004f8: c7 45 f0 01 00 00 00              mov DWORD PTR [rbp-0x10],0x1 
4004ff: c7 45 f4 02 00 00 00              mov DWORD PTR [rbp-0xc],0x2 
400506: c7 45 f8 03 00 00 00             mov DWORD PTR [rbp-0x8],0x3 
40050d: c7 45 fc 04 00 00 00             mov DWORD PTR [rbp-0x4],0x4 
400514: c7 45 ec 00 00 00 00             mov DWORD PTR [rbp-0x14],0x0 
40051b: eb 13                                     jmp 400530 <main+0x43> 
40051d: 8b 05 15 0b 20 00                 mov eax,DWORD PTR [rip+0x200b15] # 601038 <globalA> 
400523: 83 e8 01                                 sub eax,0x1 
400526: 89 05 0c 0b 20 00                 mov DWORD PTR [rip+0x200b0c],eax # 601038 <globalA> 
40052c: 83 45 ec 01                           add DWORD PTR [rbp-0x14],0x1 
400530: 8b 05 02 0b 20 00                 mov eax,DWORD PTR [rip+0x200b02] # 601038 <globalA> 
400536: 39 45 ec                               cmp DWORD PTR [rbp-0x14],eax 
400539: 7c e2                                     jl 40051d <main+0x30> 
40053b: 5d                                         pop rbp 
40053c: c3                                           ret 
40053d: 0f 1f 00                                 nop DWORD PTR [rax]

 

 

objdump -d

Description

objdump displays information about one or more object files. The options control what particular information to display. This information is mostly useful to programmers who are working on the compilation tools, as opposed to programmers who just want their program to compile and work.

objfile... are the object files to be examined. When you specify archives, objdump shows information on each of the member object files.

Options

The long and short forms of options, shown here as alternatives, are equivalent. At least one option from the list -a,-d,-D,-e,-f,-g,-G,-h,-H,-p,-r,-R,-s,-S,-t,-T,-V,-x must be given.

 

-d--disassembleDisplay the assembler mnemonics for the machine instructions from objfile. This option only disassembles those sections which are expected to contain instructions.

 

 

 

 

출처 :

ko.wikipedia.org/wiki/Objdump

linux.die.net/man/1/objdump

 

 

 

대상 웹사이트에서

 

인증 우회하려고하는 대상에 해당되는 함수찾을때.

또한 우회 코드 힌트를 얻을때.

 

 

- F12 개발자도구 - Element 메뉴로 소스코드 찾기

- 해당 웹사이트의 전체 소스코드가 있는 데서 찾기

- 우회하려고하는 대상이 있는 페이지에서 페이지 소스에서 찾기

- 대상이 있는 페이지에서 해당 동작 행하며 관련 소스코드, 함수 얻기

(글쓰기 권한을 우회하고 싶으면 [글쓰기] 버튼을 클릭할때 관련된 소스코드를 개발자도구로 알아내기)  

- 일반 아이디 하나 가입해서 그걸로 여러 관련 페이지들 돌아다니며 그곳들의 소스코드에서 찾기?

(로그인 전과 로그인 후의 소스코드가 다를 수 있다.) 

 

lea 명령어와 mov 명령어 비교

[어셈블리어]

global main

section .text 
main: 
        mov     eax, 1 
        mov     ebx, 4 
        mov     ecx, 7 
        lea       eax, [eax+ecx] 
        lea       ebx, [ebx*4] 
        mov     eax, [eax+ecx]

 

 

- lea 명령어는 [ ] 대괄호 안의 값(여기서는 연산값)을 상수값으로 레지스터로 그대로 전달한다.

lea       eax, [eax+ecx]   결과.

 

<eax 값 출력>          

                               (16진수)  (10진수)

info reg $eax     :           0x8          8

 

 

lea       ebx, [ebx*4]   결과. 

 

<ebx 값 출력>

                               (16진수)  (10진수)

info reg $ebx     :           0x10         16

 

 

- mov 명령어는 [ ] 대괄호 안의 값(여기서는 연산값)을 주소값으로 보고 그 주소값에 있는 값을 레지스터로 전달한다.

mov     eax, [eax+ecx]   결과.

 

<ecx 값 출력>                 

info reg $ecx     :        

[ ] 대괄호 안의 값은 eax+ecx 즉, 8+7 = 15  16진수로 F다.

이를 주소형식으로 표현하면 0x0000000F 가 되는데

이 0x0000000F 주소값에 있는 값을 레지스터(ecx)로 전달하게 된다는 말이다.

 

하지만, 이 주소는 의미없는 주소이고 접근할 수 없는 주소다. 그래서 값이 제대로 출력되지 않는다.

 

 

and, or, xor 명령어

[어셈블리어]

global main

section .text
main:
        mov     eax, 0x33
        mov     ebx, 0x55
        mov     ecx, 0x42

        and     eax, ebx
        or       eax, ecx
        xor     eax, 0xac 

 

(16진수)         (2진수)

  0x33          00110011 

  0x55          01010101

  0x42          01000010

  0xac          10101100

 

 

and      eax, ebx   결과.

 

<eax 값 출력>         

                               (16진수)     (10진수)

info reg $eax     :           0x11          17

 

   00110011      (eax)

& 01010101      (ebx) 

   00010001          ->     17 (10진수)    0x11 (16진수)

 

 

 

 

or      eax, ecx   결과.

 

<eax 값 출력>         

                               (16진수)     (10진수)

info reg $eax     :           0x53          83

 

   00010001      (eax)

|  01000010      (ecx) 

   01010011          ->     83 (10진수)    0x53 (16진수)

 

 

 

 

xor      eax, 0xac   결과.

 

<eax 값 출력>         

                               (16진수)     (10진수)

info reg $eax     :           0xff          255

 

   01010011      (eax)

^ 10101100      (0xac) 

   11111111         ->     255 (10진수)    0xff (16진수)

 

 

 

'Reverse Engineering > gdb' 카테고리의 다른 글

gdb) 레지스터 값, 메모리값 확인 명령어  (0) 2020.11.20
sub, add 명령어  (0) 2020.10.10
gdb - Segmentation Fault, 대괄호 [ ]  (0) 2020.10.07
gdb 명령어, 리틀엔디언 방식  (0) 2020.10.07
gdb 실행, 명령어  (0) 2020.10.07

sub 명령어

[어셈블리 코드]

main:

            mov      eax,  esp                                    (1)

            sub       esp,  8                                        (2)

            mov      [eax],  dword 1                          (3)

            mov      [eax-4],  dword 2                       (4)

            sub       [eax-4],  dword 1                       (5)

 

[스택 주소]

(시작)

 

high

 

bffff0a0                       <-  esp                     처음엔 esp가 최상단 주소를 가리키고 있음.

bffff09c

bffff098

 

low

 

 

(1)        mov      eax,  esp   

 

high

 

bffff0a0                       <-  esp                     

                                 <-  eax                      esp가 가리키는 주소를 eax에도 할당.

bffff09c

bffff098

 

low

 

 

(2)        sub       esp,  8

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                       sub 명령어를 통해 esp가 가리키는 주소를 8만큼 내린다(빼준다).

                                         (즉, 주소 공간을 2개 만큼 아래로 확보한다는 말? 각 주소는 4크기 만큼의 차이가 있다.)

low

 

 

(3)        mov      [eax],  dword 1

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                     

 

low

 

 

<주소값 출력>

bffff0a0   :         0x00000001                           eax가 가리키는 주소에 1 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 할당한 것.)

 

 

(4)        mov      [eax-4],  dword 2

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                     

 

low

 

 

<주소값 출력>

bffff09c   :         0x00000002                eax가 가리키는 주소(bffff0a0)에 4 만큼 뺀(내려간) 주소(bffff09c)에 2 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 2값을 할당한 것.)

 

 

(5)        sub       [eax-4],  dword 1 

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                     

 

low

 

 

<주소값 출력>

bffff09c   :         0x00000001       

 

                                    eax가 가리키는 주소에 4 만큼 뺀(내려간) 주소(bffff09c)의 값(0x00000002)에서 1만큼을 sub

                                   (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 뺸 것.)

 

 

add 명령어

[어셈블리 코드]

main:

            mov      eax,  esp                                    (1)

            add       esp,  8                                        (2)

            mov      [eax],  dword 1                          (3)

            mov      [eax+4],  dword 2                       (4)

            add       [eax+4],  dword 1                       (5)

 

[스택 주소]

(시작)

 

high

 

bffff0a8

bffff0a4

bffff0a0                       <-  esp                     처음엔 esp가 최상단 주소를 가리키고 있음.

bffff09c

bffff098

 

low

 

 

(1)        mov      eax,  esp   

 

high

 

bffff0a8

bffff0a4

bffff0a0                       <-  esp                     

                                 <-  eax                      esp가 가리키는 주소를 eax에도 할당.

bffff09c

bffff098

 

low

 

 

(2)        add       esp,  8

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                                               

 

low

 

 

                                             add 명령어를 통해 esp가 가리키는 주소를 8만큼 올린다(더한다).

                                            (즉, 주소 공간을 2개 만큼 위로 확보한다는 말? 각 주소는 4크기 만큼의 차이가 있다.)

 

 

(3)        mov      [eax],  dword 1

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                                            

 

low

 

 

<주소값 출력>

bffff0a0   :         0x00000001                           eax가 가리키는 주소에 1 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 할당한 것.)

 

 

(4)        mov      [eax+4],  dword 2

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                       

 

low

 

 

<주소값 출력>

bffff0a4   :         0x00000002             eax가 가리키는 주소(bffff0a0)에 4 만큼 더한(올라간) 주소(bffff0a4)에 2 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 2값을 할당한 것.)

 

 

(5)        add       [eax+4],  dword 1 

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                                      

 

low

 

 

<주소값 출력>

bffff0a4   :         0x00000001       

 

                                eax가 가리키는 주소에 4 만큼 더한(올라간) 주소(bffff0a4)의 값(0x00000002)에서 1만큼을 add

                                   (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 더한 것.)

 

 

 

 

 

+ Recent posts