개발/Assembly

Hello World! 어셈블리 분석 - AMD64 어셈블리 기초

ensuta 2022. 2. 9. 02:34
728x90
반응형

Hello, World! 출력을 분석해보자

Hello.c

#include <stdio.h>			//표준 라이브러리
int main(void){			//main 함수 선언
	printf("Hello world\n");	//printf표준함수로 문자열 출력
    return 0;			//무결성 증명
    }

간단한 Hello world 프로그램이지만 많은 원리가 있다.

 

어셈블리를 분석하려면 당연히 어셈블리어를 알아야 한다.

어셈블리 구조

어셈블리어 수행 방식

Opcode Operand
INC RAX

어셈블리는 Opcode와 Operand 그리고 ;로 시작하는 주석이 있다.

Opcode는 명령어

Operand는 명령이 수행될 공간 또는 데이터

; 주석

 

Opcode Operand1(Destination) Operand2(Source)
ADD RBX RAX

Intel기반 코어랑 AT&T기반 코어는 문법이 다르다!

 

Intel의 경우

Operand2가 Source고 Operand1이 Destination이 된다.

EBX의 값을 EAX에 더한다라는 뜻이 된다.

숫자를 그대로 쓴다.

1 2 3 => 1 2 3

레지스터를 명칭 그대로 쓴다.

 rax rbx => rbx rax
Opcode Operand1(Source) Operand2(Destination)
ADD RAX RBX

AT&T의 경우

AT&T는 반대다.

Operand1가 Source고 Operand2이 Destination이 된다.

EAX의 값을 EBX로 더한다라는 뜻 이다. 

숫자에 $를 붙인다.

 1 2 3 => $1 $2 $3

레지스터를 명칭에 %를 붙인다.

rax rbx => %rax %rbx

 

레지스터

레지스터는 CPU 에 직접 데이터를 보관하는 임시 공간이다.

일반적인 CPU의 내부구조

 

CPU는 자체적인 데이터 저장을 수행할 수 없다.

레지스터를 이용하여 연산처리와 번지지정을 돕게된다.

 

다크모드에서는 안 보일 수 있다

컴퓨터 설계에 따라 레지스터가 바뀐다.

32bits 체계에서는 레지스터가 E--

64bits 체계에서는 레지스터가 R--

서로 다른 이름을 갖는다.

 

범용 레지스터

AX : 사칙연산 등 산술 연산에 자동으로 사용된다. 또, 함수의 반환 값을 처리에도 사용된다.

BX : 간접 번지 지정에 사용된다. 산수, 변수를 저장한다.

CX : 반복(Loop)문에서 반복을 Count 한다.

DX : EAX의 보조 격이다. 만약 나누기를 진행한다면 몫은 EAX에 나머지는 EDX에 저장되는 식.

 

인덱스 레지스터

SI : 값 복사나 값을 서로 비교할 때 출발지(Source) 주소를 저장하는 레지스터이다.

DI : 값 복사나 값을 서로 비교할 때 목적지(Destination) 주소를 저장하는 레지스터이다.

 

포인트 레지스터

IP :  다음 순서에 실행할 명령어의 메모리 주소(memory address)를 저장하고 있는 레지스터이다. 현재 명령어가 종료되면 여기의 명령어를 실행한다.

SP : Stack Pointer의 가장 최근에 저장된 공간의 메모리 주소를 저장하는 레지스터이다.

BP : Stack Pointer의 기준점(Base point)을 저장하는 레지스터이다.

 

많이 쓰이는 명령어 종류

명령어는 엄청나게 많다.

그 중에서도 반복적으로 사용되는 것도 있을 것이다.

이걸 알아야 어셈블리어를 해석할 수 있다.

명령어 예시 명령 기능 분류
push push rax rax의 값을 스택에 저장 스택 조작
pop pop rax 스택 가장 상위에 있는 값을 꺼내서 rax에 저장 스택 조작
mov mov rax, rbx 메모리나 레지스터의 값을 옮길때 사용 (move) 데이터 이동
inc lnc rax rax의 값을 1증가시킨다 (increase)(++) 데이터 조작
dec dec rax rax의 값을 1감소시킨다 (decrease)(--) 데이터 조작
add add rax, rbx 레지스터나 메모리의 값을 덧셈(additon)할때 쓰인다. 논리, 연산
sub sub rax, rbx 레지스터나 메모리의 값을 뺄셈(subtract)할때 쓰인다. 논리, 연산
call call proc 프로시저(Procedure)를 호출(call)한다. 프로시저
ret ret 호출했던 바로 다음 지점으로 이동 프로시저
cmp cmp rax, rbx 레지스터(register)와 레지스터의 값을 비교 비교
jmp jmp proc 특정한 곳으로 분기(jump) 분기
int  int $0x80 OS에 할당된 인터럽트 영역을 system call 한다. 인터럽트
nop nop 아무 동작도 하지 않는다. (No Operationd의 약어)  

시스템 콜(System Call)에 대한 자세한 내용

-출처- https://coding-factory.tistory.com/651

 

어셈블리 섹션

어셈블리어는 크게 섹션(section)으로 나뉜다.

색션은 바이트가 재배치될 수 있는 오브젝트 파일의 가장 작은 단위이다.

즉 섹션 내부에서는 명령어셋은 순서가 변할 수 없다.

 

section.data

데이터 섹션은 초기화된 데이터 또는 상수를 선언하는 데 사용한다.

이 데이터는 런타임(Runtime)에 변경되지 않는다.

다양한 상수 값, 파일 이름, 버퍼 크기 등을 선언할 수 있다.

 

section.text

실제 코드가 있는 섹션이다. 일반적인 CPU 에서는 선언으로 시작해야 정상 작동한다. 

global _start이 프로그램 실행이 시작되는 위치를 커널(kernel)에 알려주는 역할을 한다.

section.text
   global _start
_start:

section.bss

bss 섹션은 초기화되지 않은 Read-Write 값이 들어간다. 따라서 변수 선언에 사용된다.

 

section.init

init 섹션은 런타임 초기화 명령

 

section.plt

plt 섹션은 프로시저 연결 테이블

 

section.fini

fini 섹션은 런타임 끝 명령

 

 

Helloworld의 실제 코드를 보자.

 

먼저 Helloworld.c 의 전체 소스코드를 보자.

$objdump --full-contents helloworld

--full-contents 대신 -s 옵션을 사용해도 된다.

 

펼치면 C 소스코드를 볼 수 있다.

더보기

 

Contents of section .interp:
 0318 2f6c6962 36342f6c 642d6c69 6e75782d  /lib64/ld-linux-
 0328 7838362d 36342e73 6f2e3200           x86-64.so.2.    
Contents of section .note.gnu.property:
 0338 04000000 30000000 05000000 474e5500  ....0.......GNU.
 0348 028000c0 04000000 01000000 00000000  ................
 0358 010001c0 04000000 01000000 00000000  ................
 0368 020001c0 04000000 00000000 00000000  ................
Contents of section .note.gnu.build-id:
 0378 04000000 14000000 03000000 474e5500  ............GNU.
 0388 bd9fae1c daefff93 d7cf1d3e 7260fe7e  ...........>r`.~
 0398 efef7f6e                             ...n            
Contents of section .note.ABI-tag:
 039c 04000000 10000000 01000000 474e5500  ............GNU.
 03ac 00000000 04000000 04000000 00000000  ................
Contents of section .gnu.hash:
 03c0 01000000 01000000 01000000 00000000  ................
 03d0 00000000 00000000 00000000           ............    
Contents of section .dynsym:
 03e0 00000000 00000000 00000000 00000000  ................
 03f0 00000000 00000000 3f000000 20000000  ........?... ...
 0400 00000000 00000000 00000000 00000000  ................
 0410 01000000 12000000 00000000 00000000  ................
 0420 00000000 00000000 17000000 12000000  ................
 0430 00000000 00000000 00000000 00000000  ................
 0440 5b000000 20000000 00000000 00000000  [... ...........
 0450 00000000 00000000 6a000000 20000000  ........j... ...
 0460 00000000 00000000 00000000 00000000  ................
 0470 08000000 22000000 00000000 00000000  ...."...........
 0480 00000000 00000000                    ........        
Contents of section .dynstr:
 0488 00707269 6e746600 5f5f6378 615f6669  .printf.__cxa_fi
 0498 6e616c69 7a65005f 5f6c6962 635f7374  nalize.__libc_st
 04a8 6172745f 6d61696e 006c6962 632e736f  art_main.libc.so
 04b8 2e360047 4c494243 5f322e32 2e35005f  .6.GLIBC_2.2.5._
 04c8 49544d5f 64657265 67697374 6572544d  ITM_deregisterTM
 04d8 436c6f6e 65546162 6c65005f 5f676d6f  CloneTable.__gmo
 04e8 6e5f7374 6172745f 5f005f49 544d5f72  n_start__._ITM_r
 04f8 65676973 74657254 4d436c6f 6e655461  egisterTMCloneTa
 0508 626c6500                             ble.            
Contents of section .gnu.version:
 050c 00000000 02000200 00000000 0200      ..............  
Contents of section .gnu.version_r:
 0520 01000100 29000000 10000000 00000000  ....)...........
 0530 751a6909 00000200 33000000 00000000  u.i.....3.......
Contents of section .rela.dyn:
 0540 e83d0000 00000000 08000000 00000000  .=..............
 0550 30110000 00000000 f03d0000 00000000  0........=......
 0560 08000000 00000000 e0100000 00000000  ................
 0570 28400000 00000000 08000000 00000000  (@..............
 0580 28400000 00000000 d83f0000 00000000  (@.......?......
 0590 06000000 01000000 00000000 00000000  ................
 05a0 e03f0000 00000000 06000000 03000000  .?..............
 05b0 00000000 00000000 e83f0000 00000000  .........?......
 05c0 06000000 04000000 00000000 00000000  ................
 05d0 f03f0000 00000000 06000000 05000000  .?..............
 05e0 00000000 00000000 f83f0000 00000000  .........?......
 05f0 06000000 06000000 00000000 00000000  ................
Contents of section .rela.plt:
 0600 18400000 00000000 07000000 02000000  .@..............
 0610 00000000 00000000                    ........        
Contents of section .init:
 1000 f30f1efa 4883ec08 488b05d9 2f000048  ....H...H.../..H
 1010 85c07402 ffd04883 c408c3             ..t...H....     
Contents of section .plt:
 1020 ff35e22f 0000ff25 e42f0000 0f1f4000  .5./...%./....@.
 1030 ff25e22f 00006800 000000e9 e0ffffff  .%./..h.........
Contents of section .text:
 1040 f30f1efa 31ed4989 d15e4889 e24883e4  ....1.I..^H..H..
 1050 f050544c 8d057601 0000488d 0dff0000  .PTL..v...H.....
 1060 00488d3d d1000000 ff15722f 0000f490  .H.=......r/....
 1070 488d3db9 2f000048 8d05b22f 00004839  H.=./..H.../..H9
 1080 f8741548 8b054e2f 00004885 c07409ff  .t.H..N/..H..t..
 1090 e00f1f80 00000000 c30f1f80 00000000  ................
 10a0 488d3d89 2f000048 8d35822f 00004829  H.=./..H.5./..H)
 10b0 fe4889f0 48c1ee3f 48c1f803 4801c648  .H..H..?H...H..H
 10c0 d1fe7414 488b0525 2f000048 85c07408  ..t.H..%/..H..t.
 10d0 ffe0660f 1f440000 c30f1f80 00000000  ..f..D..........
 10e0 f30f1efa 803d452f 00000075 33554883  .....=E/...u3UH.
 10f0 3d022f00 00004889 e5740d48 8b3d262f  =./...H..t.H.=&/
 1100 0000ff15 f02e0000 e863ffff ffc6051c  .........c......
 1110 2f000001 5dc3662e 0f1f8400 00000000  /...].f.........
 1120 c366662e 0f1f8400 00000000 0f1f4000  .ff...........@.
 1130 f30f1efa e967ffff ff554889 e5488d05  .....g...UH..H..
 1140 c00e0000 4889c7b8 00000000 e8dffeff  ....H...........
 1150 ffb80000 00005dc3 0f1f8400 00000000  ......].........
 1160 f30f1efa 41574c8d 3d7b2c00 00415649  ....AWL.={,..AVI
 1170 89d64155 4989f541 544189fc 55488d2d  ..AUI..ATA..UH.-
 1180 6c2c0000 534c29fd 4883ec08 e86ffeff  l,..SL).H....o..
 1190 ff48c1fd 03741f31 db0f1f80 00000000  .H...t.1........
 11a0 4c89f24c 89ee4489 e741ff14 df4883c3  L..L..D..A...H..
 11b0 014839dd 75ea4883 c4085b5d 415c415d  .H9.u.H...[]A\A]
 11c0 415e415f c366662e 0f1f8400 00000000  A^A_.ff.........
 11d0 f30f1efa c3                          .....           
Contents of section .fini:
 11d8 f30f1efa 4883ec08 4883c408 c3        ....H...H....   
Contents of section .rodata:
 2000 01000200 48656c6c 6f20576f 726c6421  ....Hello World!
 2010 00                                   .               
Contents of section .eh_frame_hdr:
 2014 011b033b 30000000 05000000 0cf0ffff  ...;0...........
 2024 64000000 2cf0ffff 4c000000 25f1ffff  d...,...L...%...
 2034 8c000000 4cf1ffff ac000000 bcf1ffff  ....L...........
 2044 f4000000                             ....            
Contents of section .eh_frame:
 2048 14000000 00000000 017a5200 01781001  .........zR..x..
 2058 1b0c0708 90010000 14000000 1c000000  ................
 2068 d8efffff 2f000000 00440710 00000000  ..../....D......
 2078 24000000 34000000 a0efffff 20000000  $...4....... ...
 2088 000e1046 0e184a0f 0b770880 003f1a3b  ...F..J..w...?.;
 2098 2a332422 00000000 1c000000 5c000000  *3$"........\...
 20a8 91f0ffff 1f000000 00410e10 8602430d  .........A....C.
 20b8 065a0c07 08000000 44000000 7c000000  .Z......D...|...
 20c8 98f0ffff 65000000 00460e10 8f02490e  ....e....F....I.
 20d8 188e0345 0e208d04 450e288c 05440e30  ...E. ..E.(..D.0
 20e8 8606480e 38830747 0e406e0e 38410e30  ..H.8..G.@n.8A.0
 20f8 410e2842 0e20420e 18420e10 420e0800  A.(B. B..B..B...
 2108 10000000 c4000000 c0f0ffff 05000000  ................
 2118 00000000 00000000                    ........        
Contents of section .init_array:
 3de8 30110000 00000000                    0.......        
Contents of section .fini_array:
 3df0 e0100000 00000000                    ........        
Contents of section .dynamic:
 3df8 01000000 00000000 29000000 00000000  ........).......
 3e08 0c000000 00000000 00100000 00000000  ................
 3e18 0d000000 00000000 d8110000 00000000  ................
 3e28 19000000 00000000 e83d0000 00000000  .........=......
 3e38 1b000000 00000000 08000000 00000000  ................
 3e48 1a000000 00000000 f03d0000 00000000  .........=......
 3e58 1c000000 00000000 08000000 00000000  ................
 3e68 f5feff6f 00000000 c0030000 00000000  ...o............
 3e78 05000000 00000000 88040000 00000000  ................
 3e88 06000000 00000000 e0030000 00000000  ................
 3e98 0a000000 00000000 84000000 00000000  ................
 3ea8 0b000000 00000000 18000000 00000000  ................
 3eb8 15000000 00000000 00000000 00000000  ................
 3ec8 03000000 00000000 00400000 00000000  .........@......
 3ed8 02000000 00000000 18000000 00000000  ................
 3ee8 14000000 00000000 07000000 00000000  ................
 3ef8 17000000 00000000 00060000 00000000  ................
 3f08 07000000 00000000 40050000 00000000  ........@.......
 3f18 08000000 00000000 c0000000 00000000  ................
 3f28 09000000 00000000 18000000 00000000  ................
 3f38 fbffff6f 00000000 00000008 00000000  ...o............
 3f48 feffff6f 00000000 20050000 00000000  ...o.... .......
 3f58 ffffff6f 00000000 01000000 00000000  ...o............
 3f68 f0ffff6f 00000000 0c050000 00000000  ...o............
 3f78 f9ffff6f 00000000 03000000 00000000  ...o............
 3f88 00000000 00000000 00000000 00000000  ................
 3f98 00000000 00000000 00000000 00000000  ................
 3fa8 00000000 00000000 00000000 00000000  ................
 3fb8 00000000 00000000 00000000 00000000  ................
 3fc8 00000000 00000000 00000000 00000000  ................
Contents of section .got:
 3fd8 00000000 00000000 00000000 00000000  ................
 3fe8 00000000 00000000 00000000 00000000  ................
 3ff8 00000000 00000000                    ........        
Contents of section .got.plt:
 4000 f83d0000 00000000 00000000 00000000  .=..............
 4010 00000000 00000000 36100000 00000000  ........6.......
Contents of section .data:
 4020 00000000 00000000 28400000 00000000  ........(@......
Contents of section .comment:
 0000 4743433a 2028474e 55292031 312e312e  GCC: (GNU) 11.1.
 0010 3000

다른 Helloworld 예제에 비해 들여쓰기도 없이 왜 이렇게 복잡하게 나왔을까?

바로 gcc 컴파일러를 이용해서 컴파일 된 파일을 디컴파일했기 때문이다.

소스코드에서 사용된 라이브러리 명을 보면 알겠지만 gcc 2.2.5-AMD64 linux환경에서 컴파일했다.

 

리버스 엔지니어링 자체가 프로그램 해킹이라는 사실을 다시 알 수 있다. 컴파일한 컴퓨터 환경이 드러나게 된다.

 

이제 C로 작성된 소스코드를 어셈블리어로 번역된 모습을 보자.

$ objdump -d <program>

완전 길다.

 

펼치면 어셈블리 코드를 볼 수 있다.

더보기
helloworld:     file format elf64-x86-64


Disassembly of section .interp:

0000000000000318 <.interp>:
 318:	2f                   	(bad)  
 319:	6c                   	insb   (%dx),%es:(%rdi)
 31a:	69 62 36 34 2f 6c 64 	imul   $0x646c2f34,0x36(%rdx),%esp
 321:	2d 6c 69 6e 75       	sub    $0x756e696c,%eax
 326:	78 2d                	js     355 <__abi_tag-0x47>
 328:	78 38                	js     362 <__abi_tag-0x3a>
 32a:	36 2d 36 34 2e 73    	ss sub $0x732e3436,%eax
 330:	6f                   	outsl  %ds:(%rsi),(%dx)
 331:	2e 32 00             	cs xor (%rax),%al

Disassembly of section .note.gnu.property:

0000000000000338 <.note.gnu.property>:
 338:	04 00                	add    $0x0,%al
 33a:	00 00                	add    %al,(%rax)
 33c:	30 00                	xor    %al,(%rax)
 33e:	00 00                	add    %al,(%rax)
 340:	05 00 00 00 47       	add    $0x47000000,%eax
 345:	4e 55                	rex.WRX push %rbp
 347:	00 02                	add    %al,(%rdx)
 349:	80 00 c0             	addb   $0xc0,(%rax)
 34c:	04 00                	add    $0x0,%al
 34e:	00 00                	add    %al,(%rax)
 350:	01 00                	add    %eax,(%rax)
 352:	00 00                	add    %al,(%rax)
 354:	00 00                	add    %al,(%rax)
 356:	00 00                	add    %al,(%rax)
 358:	01 00                	add    %eax,(%rax)
 35a:	01 c0                	add    %eax,%eax
 35c:	04 00                	add    $0x0,%al
 35e:	00 00                	add    %al,(%rax)
 360:	01 00                	add    %eax,(%rax)
 362:	00 00                	add    %al,(%rax)
 364:	00 00                	add    %al,(%rax)
 366:	00 00                	add    %al,(%rax)
 368:	02 00                	add    (%rax),%al
 36a:	01 c0                	add    %eax,%eax
 36c:	04 00                	add    $0x0,%al
	...

Disassembly of section .note.gnu.build-id:

0000000000000378 <.note.gnu.build-id>:
 378:	04 00                	add    $0x0,%al
 37a:	00 00                	add    %al,(%rax)
 37c:	14 00                	adc    $0x0,%al
 37e:	00 00                	add    %al,(%rax)
 380:	03 00                	add    (%rax),%eax
 382:	00 00                	add    %al,(%rax)
 384:	47                   	rex.RXB
 385:	4e 55                	rex.WRX push %rbp
 387:	00 bd 9f ae 1c da    	add    %bh,-0x25e35161(%rbp)
 38d:	ef                   	out    %eax,(%dx)
 38e:	ff 93 d7 cf 1d 3e    	call   *0x3e1dcfd7(%rbx)
 394:	72 60                	jb     3f6 <__abi_tag+0x5a>
 396:	fe                   	(bad)  
 397:	7e ef                	jle    388 <__abi_tag-0x14>
 399:	ef                   	out    %eax,(%dx)
 39a:	7f 6e                	jg     40a <__abi_tag+0x6e>

Disassembly of section .note.ABI-tag:

000000000000039c <__abi_tag>:
 39c:	04 00                	add    $0x0,%al
 39e:	00 00                	add    %al,(%rax)
 3a0:	10 00                	adc    %al,(%rax)
 3a2:	00 00                	add    %al,(%rax)
 3a4:	01 00                	add    %eax,(%rax)
 3a6:	00 00                	add    %al,(%rax)
 3a8:	47                   	rex.RXB
 3a9:	4e 55                	rex.WRX push %rbp
 3ab:	00 00                	add    %al,(%rax)
 3ad:	00 00                	add    %al,(%rax)
 3af:	00 04 00             	add    %al,(%rax,%rax,1)
 3b2:	00 00                	add    %al,(%rax)
 3b4:	04 00                	add    $0x0,%al
 3b6:	00 00                	add    %al,(%rax)
 3b8:	00 00                	add    %al,(%rax)
	...

Disassembly of section .gnu.hash:

00000000000003c0 <.gnu.hash>:
 3c0:	01 00                	add    %eax,(%rax)
 3c2:	00 00                	add    %al,(%rax)
 3c4:	01 00                	add    %eax,(%rax)
 3c6:	00 00                	add    %al,(%rax)
 3c8:	01 00                	add    %eax,(%rax)
	...

Disassembly of section .dynsym:

00000000000003e0 <.dynsym>:
	...
 3f8:	3f                   	(bad)  
 3f9:	00 00                	add    %al,(%rax)
 3fb:	00 20                	add    %ah,(%rax)
	...
 40d:	00 00                	add    %al,(%rax)
 40f:	00 01                	add    %al,(%rcx)
 411:	00 00                	add    %al,(%rax)
 413:	00 12                	add    %dl,(%rdx)
	...
 425:	00 00                	add    %al,(%rax)
 427:	00 17                	add    %dl,(%rdi)
 429:	00 00                	add    %al,(%rax)
 42b:	00 12                	add    %dl,(%rdx)
	...
 43d:	00 00                	add    %al,(%rax)
 43f:	00 5b 00             	add    %bl,0x0(%rbx)
 442:	00 00                	add    %al,(%rax)
 444:	20 00                	and    %al,(%rax)
	...
 456:	00 00                	add    %al,(%rax)
 458:	6a 00                	push   $0x0
 45a:	00 00                	add    %al,(%rax)
 45c:	20 00                	and    %al,(%rax)
	...
 46e:	00 00                	add    %al,(%rax)
 470:	08 00                	or     %al,(%rax)
 472:	00 00                	add    %al,(%rax)
 474:	22 00                	and    (%rax),%al
	...

Disassembly of section .dynstr:

0000000000000488 <.dynstr>:
 488:	00 70 72             	add    %dh,0x72(%rax)
 48b:	69 6e 74 66 00 5f 5f 	imul   $0x5f5f0066,0x74(%rsi),%ebp
 492:	63 78 61             	movsxd 0x61(%rax),%edi
 495:	5f                   	pop    %rdi
 496:	66 69 6e 61 6c 69    	imul   $0x696c,0x61(%rsi),%bp
 49c:	7a 65                	jp     503 <__abi_tag+0x167>
 49e:	00 5f 5f             	add    %bl,0x5f(%rdi)
 4a1:	6c                   	insb   (%dx),%es:(%rdi)
 4a2:	69 62 63 5f 73 74 61 	imul   $0x6174735f,0x63(%rdx),%esp
 4a9:	72 74                	jb     51f <__abi_tag+0x183>
 4ab:	5f                   	pop    %rdi
 4ac:	6d                   	insl   (%dx),%es:(%rdi)
 4ad:	61                   	(bad)  
 4ae:	69 6e 00 6c 69 62 63 	imul   $0x6362696c,0x0(%rsi),%ebp
 4b5:	2e 73 6f             	jae,pn 527 <__abi_tag+0x18b>
 4b8:	2e 36 00 47 4c       	cs ss add %al,0x4c(%rdi)
 4bd:	49                   	rex.WB
 4be:	42                   	rex.X
 4bf:	43 5f                	rex.XB pop %r15
 4c1:	32 2e                	xor    (%rsi),%ch
 4c3:	32 2e                	xor    (%rsi),%ch
 4c5:	35 00 5f 49 54       	xor    $0x54495f00,%eax
 4ca:	4d 5f                	rex.WRB pop %r15
 4cc:	64 65 72 65          	fs gs jb 535 <__abi_tag+0x199>
 4d0:	67 69 73 74 65 72 54 	imul   $0x4d547265,0x74(%ebx),%esi
 4d7:	4d 
 4d8:	43 6c                	rex.XB insb (%dx),%es:(%rdi)
 4da:	6f                   	outsl  %ds:(%rsi),(%dx)
 4db:	6e                   	outsb  %ds:(%rsi),(%dx)
 4dc:	65 54                	gs push %rsp
 4de:	61                   	(bad)  
 4df:	62                   	(bad)  
 4e0:	6c                   	insb   (%dx),%es:(%rdi)
 4e1:	65 00 5f 5f          	add    %bl,%gs:0x5f(%rdi)
 4e5:	67 6d                	insl   (%dx),%es:(%edi)
 4e7:	6f                   	outsl  %ds:(%rsi),(%dx)
 4e8:	6e                   	outsb  %ds:(%rsi),(%dx)
 4e9:	5f                   	pop    %rdi
 4ea:	73 74                	jae    560 <__abi_tag+0x1c4>
 4ec:	61                   	(bad)  
 4ed:	72 74                	jb     563 <__abi_tag+0x1c7>
 4ef:	5f                   	pop    %rdi
 4f0:	5f                   	pop    %rdi
 4f1:	00 5f 49             	add    %bl,0x49(%rdi)
 4f4:	54                   	push   %rsp
 4f5:	4d 5f                	rex.WRB pop %r15
 4f7:	72 65                	jb     55e <__abi_tag+0x1c2>
 4f9:	67 69 73 74 65 72 54 	imul   $0x4d547265,0x74(%ebx),%esi
 500:	4d 
 501:	43 6c                	rex.XB insb (%dx),%es:(%rdi)
 503:	6f                   	outsl  %ds:(%rsi),(%dx)
 504:	6e                   	outsb  %ds:(%rsi),(%dx)
 505:	65 54                	gs push %rsp
 507:	61                   	(bad)  
 508:	62                   	.byte 0x62
 509:	6c                   	insb   (%dx),%es:(%rdi)
 50a:	65                   	gs
	...

Disassembly of section .rela.dyn:

0000000000000540 <.rela.dyn>:
 540:	e8 3d 00 00 00       	call   582 <__abi_tag+0x1e6>
 545:	00 00                	add    %al,(%rax)
 547:	00 08                	add    %cl,(%rax)
 549:	00 00                	add    %al,(%rax)
 54b:	00 00                	add    %al,(%rax)
 54d:	00 00                	add    %al,(%rax)
 54f:	00 30                	add    %dh,(%rax)
 551:	11 00                	adc    %eax,(%rax)
 553:	00 00                	add    %al,(%rax)
 555:	00 00                	add    %al,(%rax)
 557:	00 f0                	add    %dh,%al
 559:	3d 00 00 00 00       	cmp    $0x0,%eax
 55e:	00 00                	add    %al,(%rax)
 560:	08 00                	or     %al,(%rax)
 562:	00 00                	add    %al,(%rax)
 564:	00 00                	add    %al,(%rax)
 566:	00 00                	add    %al,(%rax)
 568:	e0 10                	loopne 57a <__abi_tag+0x1de>
 56a:	00 00                	add    %al,(%rax)
 56c:	00 00                	add    %al,(%rax)
 56e:	00 00                	add    %al,(%rax)
 570:	28 40 00             	sub    %al,0x0(%rax)
 573:	00 00                	add    %al,(%rax)
 575:	00 00                	add    %al,(%rax)
 577:	00 08                	add    %cl,(%rax)
 579:	00 00                	add    %al,(%rax)
 57b:	00 00                	add    %al,(%rax)
 57d:	00 00                	add    %al,(%rax)
 57f:	00 28                	add    %ch,(%rax)
 581:	40 00 00             	rex add %al,(%rax)
 584:	00 00                	add    %al,(%rax)
 586:	00 00                	add    %al,(%rax)
 588:	d8 3f                	fdivrs (%rdi)
 58a:	00 00                	add    %al,(%rax)
 58c:	00 00                	add    %al,(%rax)
 58e:	00 00                	add    %al,(%rax)
 590:	06                   	(bad)  
 591:	00 00                	add    %al,(%rax)
 593:	00 01                	add    %al,(%rcx)
	...
 59d:	00 00                	add    %al,(%rax)
 59f:	00 e0                	add    %ah,%al
 5a1:	3f                   	(bad)  
 5a2:	00 00                	add    %al,(%rax)
 5a4:	00 00                	add    %al,(%rax)
 5a6:	00 00                	add    %al,(%rax)
 5a8:	06                   	(bad)  
 5a9:	00 00                	add    %al,(%rax)
 5ab:	00 03                	add    %al,(%rbx)
	...
 5b5:	00 00                	add    %al,(%rax)
 5b7:	00 e8                	add    %ch,%al
 5b9:	3f                   	(bad)  
 5ba:	00 00                	add    %al,(%rax)
 5bc:	00 00                	add    %al,(%rax)
 5be:	00 00                	add    %al,(%rax)
 5c0:	06                   	(bad)  
 5c1:	00 00                	add    %al,(%rax)
 5c3:	00 04 00             	add    %al,(%rax,%rax,1)
	...
 5ce:	00 00                	add    %al,(%rax)
 5d0:	f0 3f                	lock (bad) 
 5d2:	00 00                	add    %al,(%rax)
 5d4:	00 00                	add    %al,(%rax)
 5d6:	00 00                	add    %al,(%rax)
 5d8:	06                   	(bad)  
 5d9:	00 00                	add    %al,(%rax)
 5db:	00 05 00 00 00 00    	add    %al,0x0(%rip)        # 5e1 <__abi_tag+0x245>
 5e1:	00 00                	add    %al,(%rax)
 5e3:	00 00                	add    %al,(%rax)
 5e5:	00 00                	add    %al,(%rax)
 5e7:	00 f8                	add    %bh,%al
 5e9:	3f                   	(bad)  
 5ea:	00 00                	add    %al,(%rax)
 5ec:	00 00                	add    %al,(%rax)
 5ee:	00 00                	add    %al,(%rax)
 5f0:	06                   	(bad)  
 5f1:	00 00                	add    %al,(%rax)
 5f3:	00 06                	add    %al,(%rsi)
	...

Disassembly of section .rela.plt:

0000000000000600 <.rela.plt>:
 600:	18 40 00             	sbb    %al,0x0(%rax)
 603:	00 00                	add    %al,(%rax)
 605:	00 00                	add    %al,(%rax)
 607:	00 07                	add    %al,(%rdi)
 609:	00 00                	add    %al,(%rax)
 60b:	00 02                	add    %al,(%rdx)
	...

Disassembly of section .init:

0000000000001000 <_init>:
    1000:	f3 0f 1e fa          	endbr64 
    1004:	48 83 ec 08          	sub    $0x8,%rsp
    1008:	48 8b 05 d9 2f 00 00 	mov    0x2fd9(%rip),%rax        # 3fe8 <__gmon_start__>
    100f:	48 85 c0             	test   %rax,%rax
    1012:	74 02                	je     1016 <_init+0x16>
    1014:	ff d0                	call   *%rax
    1016:	48 83 c4 08          	add    $0x8,%rsp
    101a:	c3                   	ret    

Disassembly of section .plt:

0000000000001020 <printf@plt-0x10>:
    1020:	ff 35 e2 2f 00 00    	push   0x2fe2(%rip)        # 4008 <_GLOBAL_OFFSET_TABLE_+0x8>
    1026:	ff 25 e4 2f 00 00    	jmp    *0x2fe4(%rip)        # 4010 <_GLOBAL_OFFSET_TABLE_+0x10>
    102c:	0f 1f 40 00          	nopl   0x0(%rax)

0000000000001030 <printf@plt>:
    1030:	ff 25 e2 2f 00 00    	jmp    *0x2fe2(%rip)        # 4018 <printf@GLIBC_2.2.5>
    1036:	68 00 00 00 00       	push   $0x0
    103b:	e9 e0 ff ff ff       	jmp    1020 <_init+0x20>

Disassembly of section .text:

0000000000001040 <_start>:
    1040:	f3 0f 1e fa          	endbr64 
    1044:	31 ed                	xor    %ebp,%ebp
    1046:	49 89 d1             	mov    %rdx,%r9
    1049:	5e                   	pop    %rsi
    104a:	48 89 e2             	mov    %rsp,%rdx
    104d:	48 83 e4 f0          	and    $0xfffffffffffffff0,%rsp
    1051:	50                   	push   %rax
    1052:	54                   	push   %rsp
    1053:	4c 8d 05 76 01 00 00 	lea    0x176(%rip),%r8        # 11d0 <__libc_csu_fini>
    105a:	48 8d 0d ff 00 00 00 	lea    0xff(%rip),%rcx        # 1160 <__libc_csu_init>
    1061:	48 8d 3d d1 00 00 00 	lea    0xd1(%rip),%rdi        # 1139 <main>
    1068:	ff 15 72 2f 00 00    	call   *0x2f72(%rip)        # 3fe0 <__libc_start_main@GLIBC_2.2.5>
    106e:	f4                   	hlt    
    106f:	90                   	nop

0000000000001070 <deregister_tm_clones>:
    1070:	48 8d 3d b9 2f 00 00 	lea    0x2fb9(%rip),%rdi        # 4030 <__TMC_END__>
    1077:	48 8d 05 b2 2f 00 00 	lea    0x2fb2(%rip),%rax        # 4030 <__TMC_END__>
    107e:	48 39 f8             	cmp    %rdi,%rax
    1081:	74 15                	je     1098 <deregister_tm_clones+0x28>
    1083:	48 8b 05 4e 2f 00 00 	mov    0x2f4e(%rip),%rax        # 3fd8 <_ITM_deregisterTMCloneTable>
    108a:	48 85 c0             	test   %rax,%rax
    108d:	74 09                	je     1098 <deregister_tm_clones+0x28>
    108f:	ff e0                	jmp    *%rax
    1091:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
    1098:	c3                   	ret    
    1099:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)

00000000000010a0 <register_tm_clones>:
    10a0:	48 8d 3d 89 2f 00 00 	lea    0x2f89(%rip),%rdi        # 4030 <__TMC_END__>
    10a7:	48 8d 35 82 2f 00 00 	lea    0x2f82(%rip),%rsi        # 4030 <__TMC_END__>
    10ae:	48 29 fe             	sub    %rdi,%rsi
    10b1:	48 89 f0             	mov    %rsi,%rax
    10b4:	48 c1 ee 3f          	shr    $0x3f,%rsi
    10b8:	48 c1 f8 03          	sar    $0x3,%rax
    10bc:	48 01 c6             	add    %rax,%rsi
    10bf:	48 d1 fe             	sar    %rsi
    10c2:	74 14                	je     10d8 <register_tm_clones+0x38>
    10c4:	48 8b 05 25 2f 00 00 	mov    0x2f25(%rip),%rax        # 3ff0 <_ITM_registerTMCloneTable>
    10cb:	48 85 c0             	test   %rax,%rax
    10ce:	74 08                	je     10d8 <register_tm_clones+0x38>
    10d0:	ff e0                	jmp    *%rax
    10d2:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
    10d8:	c3                   	ret    
    10d9:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)

00000000000010e0 <__do_global_dtors_aux>:
    10e0:	f3 0f 1e fa          	endbr64 
    10e4:	80 3d 45 2f 00 00 00 	cmpb   $0x0,0x2f45(%rip)        # 4030 <__TMC_END__>
    10eb:	75 33                	jne    1120 <__do_global_dtors_aux+0x40>
    10ed:	55                   	push   %rbp
    10ee:	48 83 3d 02 2f 00 00 	cmpq   $0x0,0x2f02(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>
    10f5:	00 
    10f6:	48 89 e5             	mov    %rsp,%rbp
    10f9:	74 0d                	je     1108 <__do_global_dtors_aux+0x28>
    10fb:	48 8b 3d 26 2f 00 00 	mov    0x2f26(%rip),%rdi        # 4028 <__dso_handle>
    1102:	ff 15 f0 2e 00 00    	call   *0x2ef0(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>
    1108:	e8 63 ff ff ff       	call   1070 <deregister_tm_clones>
    110d:	c6 05 1c 2f 00 00 01 	movb   $0x1,0x2f1c(%rip)        # 4030 <__TMC_END__>
    1114:	5d                   	pop    %rbp
    1115:	c3                   	ret    
    1116:	66 2e 0f 1f 84 00 00 	cs nopw 0x0(%rax,%rax,1)
    111d:	00 00 00 
    1120:	c3                   	ret    
    1121:	66 66 2e 0f 1f 84 00 	data16 cs nopw 0x0(%rax,%rax,1)
    1128:	00 00 00 00 
    112c:	0f 1f 40 00          	nopl   0x0(%rax)

0000000000001130 <frame_dummy>:
    1130:	f3 0f 1e fa          	endbr64 
    1134:	e9 67 ff ff ff       	jmp    10a0 <register_tm_clones>

0000000000001139 <main>:
    1139:	55                   	push   %rbp
    113a:	48 89 e5             	mov    %rsp,%rbp
    113d:	48 8d 05 c0 0e 00 00 	lea    0xec0(%rip),%rax        # 2004 <_IO_stdin_used+0x4>
    1144:	48 89 c7             	mov    %rax,%rdi
    1147:	b8 00 00 00 00       	mov    $0x0,%eax
    114c:	e8 df fe ff ff       	call   1030 <printf@plt>
    1151:	b8 00 00 00 00       	mov    $0x0,%eax
    1156:	5d                   	pop    %rbp
    1157:	c3                   	ret    
    1158:	0f 1f 84 00 00 00 00 	nopl   0x0(%rax,%rax,1)
    115f:	00 

0000000000001160 <__libc_csu_init>:
    1160:	f3 0f 1e fa          	endbr64 
    1164:	41 57                	push   %r15
    1166:	4c 8d 3d 7b 2c 00 00 	lea    0x2c7b(%rip),%r15        # 3de8 <__frame_dummy_init_array_entry>
    116d:	41 56                	push   %r14
    116f:	49 89 d6             	mov    %rdx,%r14
    1172:	41 55                	push   %r13
    1174:	49 89 f5             	mov    %rsi,%r13
    1177:	41 54                	push   %r12
    1179:	41 89 fc             	mov    %edi,%r12d
    117c:	55                   	push   %rbp
    117d:	48 8d 2d 6c 2c 00 00 	lea    0x2c6c(%rip),%rbp        # 3df0 <__do_global_dtors_aux_fini_array_entry>
    1184:	53                   	push   %rbx
    1185:	4c 29 fd             	sub    %r15,%rbp
    1188:	48 83 ec 08          	sub    $0x8,%rsp
    118c:	e8 6f fe ff ff       	call   1000 <_init>
    1191:	48 c1 fd 03          	sar    $0x3,%rbp
    1195:	74 1f                	je     11b6 <__libc_csu_init+0x56>
    1197:	31 db                	xor    %ebx,%ebx
    1199:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
    11a0:	4c 89 f2             	mov    %r14,%rdx
    11a3:	4c 89 ee             	mov    %r13,%rsi
    11a6:	44 89 e7             	mov    %r12d,%edi
    11a9:	41 ff 14 df          	call   *(%r15,%rbx,8)
    11ad:	48 83 c3 01          	add    $0x1,%rbx
    11b1:	48 39 dd             	cmp    %rbx,%rbp
    11b4:	75 ea                	jne    11a0 <__libc_csu_init+0x40>
    11b6:	48 83 c4 08          	add    $0x8,%rsp
    11ba:	5b                   	pop    %rbx
    11bb:	5d                   	pop    %rbp
    11bc:	41 5c                	pop    %r12
    11be:	41 5d                	pop    %r13
    11c0:	41 5e                	pop    %r14
    11c2:	41 5f                	pop    %r15
    11c4:	c3                   	ret    
    11c5:	66 66 2e 0f 1f 84 00 	data16 cs nopw 0x0(%rax,%rax,1)
    11cc:	00 00 00 00 

00000000000011d0 <__libc_csu_fini>:
    11d0:	f3 0f 1e fa          	endbr64 
    11d4:	c3                   	ret    

Disassembly of section .fini:

00000000000011d8 <_fini>:
    11d8:	f3 0f 1e fa          	endbr64 
    11dc:	48 83 ec 08          	sub    $0x8,%rsp
    11e0:	48 83 c4 08          	add    $0x8,%rsp
    11e4:	c3                   	ret    

Disassembly of section .rodata:

0000000000002000 <_IO_stdin_used>:
    2000:	01 00                	add    %eax,(%rax)
    2002:	02 00                	add    (%rax),%al
    2004:	48                   	rex.W
    2005:	65 6c                	gs insb (%dx),%es:(%rdi)
    2007:	6c                   	insb   (%dx),%es:(%rdi)
    2008:	6f                   	outsl  %ds:(%rsi),(%dx)
    2009:	20 57 6f             	and    %dl,0x6f(%rdi)
    200c:	72 6c                	jb     207a <__GNU_EH_FRAME_HDR+0x66>
    200e:	64 21 00             	and    %eax,%fs:(%rax)

Disassembly of section .eh_frame_hdr:

0000000000002014 <__GNU_EH_FRAME_HDR>:
    2014:	01 1b                	add    %ebx,(%rbx)
    2016:	03 3b                	add    (%rbx),%edi
    2018:	30 00                	xor    %al,(%rax)
    201a:	00 00                	add    %al,(%rax)
    201c:	05 00 00 00 0c       	add    $0xc000000,%eax
    2021:	f0 ff                	lock (bad) 
    2023:	ff 64 00 00          	jmp    *0x0(%rax,%rax,1)
    2027:	00 2c f0             	add    %ch,(%rax,%rsi,8)
    202a:	ff                   	(bad)  
    202b:	ff 4c 00 00          	decl   0x0(%rax,%rax,1)
    202f:	00 25 f1 ff ff 8c    	add    %ah,-0x7300000f(%rip)        # ffffffff8d002026 <_end+0xffffffff8cffdfee>
    2035:	00 00                	add    %al,(%rax)
    2037:	00 4c f1 ff          	add    %cl,-0x1(%rcx,%rsi,8)
    203b:	ff ac 00 00 00 bc f1 	ljmp   *-0xe440000(%rax,%rax,1)
    2042:	ff                   	(bad)  
    2043:	ff f4                	push   %rsp
    2045:	00 00                	add    %al,(%rax)
	...

Disassembly of section .eh_frame:

0000000000002048 <__FRAME_END__-0xd4>:
    2048:	14 00                	adc    $0x0,%al
    204a:	00 00                	add    %al,(%rax)
    204c:	00 00                	add    %al,(%rax)
    204e:	00 00                	add    %al,(%rax)
    2050:	01 7a 52             	add    %edi,0x52(%rdx)
    2053:	00 01                	add    %al,(%rcx)
    2055:	78 10                	js     2067 <__GNU_EH_FRAME_HDR+0x53>
    2057:	01 1b                	add    %ebx,(%rbx)
    2059:	0c 07                	or     $0x7,%al
    205b:	08 90 01 00 00 14    	or     %dl,0x14000001(%rax)
    2061:	00 00                	add    %al,(%rax)
    2063:	00 1c 00             	add    %bl,(%rax,%rax,1)
    2066:	00 00                	add    %al,(%rax)
    2068:	d8 ef                	fsubr  %st(7),%st
    206a:	ff                   	(bad)  
    206b:	ff 2f                	ljmp   *(%rdi)
    206d:	00 00                	add    %al,(%rax)
    206f:	00 00                	add    %al,(%rax)
    2071:	44 07                	rex.R (bad) 
    2073:	10 00                	adc    %al,(%rax)
    2075:	00 00                	add    %al,(%rax)
    2077:	00 24 00             	add    %ah,(%rax,%rax,1)
    207a:	00 00                	add    %al,(%rax)
    207c:	34 00                	xor    $0x0,%al
    207e:	00 00                	add    %al,(%rax)
    2080:	a0 ef ff ff 20 00 00 	movabs 0x20ffffef,%al
    2087:	00 00 
    2089:	0e                   	(bad)  
    208a:	10 46 0e             	adc    %al,0xe(%rsi)
    208d:	18 4a 0f             	sbb    %cl,0xf(%rdx)
    2090:	0b 77 08             	or     0x8(%rdi),%esi
    2093:	80 00 3f             	addb   $0x3f,(%rax)
    2096:	1a 3b                	sbb    (%rbx),%bh
    2098:	2a 33                	sub    (%rbx),%dh
    209a:	24 22                	and    $0x22,%al
    209c:	00 00                	add    %al,(%rax)
    209e:	00 00                	add    %al,(%rax)
    20a0:	1c 00                	sbb    $0x0,%al
    20a2:	00 00                	add    %al,(%rax)
    20a4:	5c                   	pop    %rsp
    20a5:	00 00                	add    %al,(%rax)
    20a7:	00 91 f0 ff ff 1f    	add    %dl,0x1ffffff0(%rcx)
    20ad:	00 00                	add    %al,(%rax)
    20af:	00 00                	add    %al,(%rax)
    20b1:	41 0e                	rex.B (bad) 
    20b3:	10 86 02 43 0d 06    	adc    %al,0x60d4302(%rsi)
    20b9:	5a                   	pop    %rdx
    20ba:	0c 07                	or     $0x7,%al
    20bc:	08 00                	or     %al,(%rax)
    20be:	00 00                	add    %al,(%rax)
    20c0:	44 00 00             	add    %r8b,(%rax)
    20c3:	00 7c 00 00          	add    %bh,0x0(%rax,%rax,1)
    20c7:	00 98 f0 ff ff 65    	add    %bl,0x65fffff0(%rax)
    20cd:	00 00                	add    %al,(%rax)
    20cf:	00 00                	add    %al,(%rax)
    20d1:	46 0e                	rex.RX (bad) 
    20d3:	10 8f 02 49 0e 18    	adc    %cl,0x180e4902(%rdi)
    20d9:	8e 03                	mov    (%rbx),%es
    20db:	45 0e                	rex.RB (bad) 
    20dd:	20 8d 04 45 0e 28    	and    %cl,0x280e4504(%rbp)
    20e3:	8c 05 44 0e 30 86    	mov    %es,-0x79cff1bc(%rip)        # ffffffff86302f2d <_end+0xffffffff862feef5>
    20e9:	06                   	(bad)  
    20ea:	48 0e                	rex.W (bad) 
    20ec:	38 83 07 47 0e 40    	cmp    %al,0x400e4707(%rbx)
    20f2:	6e                   	outsb  %ds:(%rsi),(%dx)
    20f3:	0e                   	(bad)  
    20f4:	38 41 0e             	cmp    %al,0xe(%rcx)
    20f7:	30 41 0e             	xor    %al,0xe(%rcx)
    20fa:	28 42 0e             	sub    %al,0xe(%rdx)
    20fd:	20 42 0e             	and    %al,0xe(%rdx)
    2100:	18 42 0e             	sbb    %al,0xe(%rdx)
    2103:	10 42 0e             	adc    %al,0xe(%rdx)
    2106:	08 00                	or     %al,(%rax)
    2108:	10 00                	adc    %al,(%rax)
    210a:	00 00                	add    %al,(%rax)
    210c:	c4                   	(bad)  
    210d:	00 00                	add    %al,(%rax)
    210f:	00 c0                	add    %al,%al
    2111:	f0 ff                	lock (bad) 
    2113:	ff 05 00 00 00 00    	incl   0x0(%rip)        # 2119 <__GNU_EH_FRAME_HDR+0x105>
    2119:	00 00                	add    %al,(%rax)
	...

000000000000211c <__FRAME_END__>:
    211c:	00 00                	add    %al,(%rax)
	...

Disassembly of section .init_array:

0000000000003de8 <__frame_dummy_init_array_entry>:
    3de8:	30 11                	xor    %dl,(%rcx)
    3dea:	00 00                	add    %al,(%rax)
    3dec:	00 00                	add    %al,(%rax)
	...

Disassembly of section .fini_array:

0000000000003df0 <__do_global_dtors_aux_fini_array_entry>:
    3df0:	e0 10                	loopne 3e02 <_DYNAMIC+0xa>
    3df2:	00 00                	add    %al,(%rax)
    3df4:	00 00                	add    %al,(%rax)
	...

Disassembly of section .dynamic:

0000000000003df8 <_DYNAMIC>:
    3df8:	01 00                	add    %eax,(%rax)
    3dfa:	00 00                	add    %al,(%rax)
    3dfc:	00 00                	add    %al,(%rax)
    3dfe:	00 00                	add    %al,(%rax)
    3e00:	29 00                	sub    %eax,(%rax)
    3e02:	00 00                	add    %al,(%rax)
    3e04:	00 00                	add    %al,(%rax)
    3e06:	00 00                	add    %al,(%rax)
    3e08:	0c 00                	or     $0x0,%al
    3e0a:	00 00                	add    %al,(%rax)
    3e0c:	00 00                	add    %al,(%rax)
    3e0e:	00 00                	add    %al,(%rax)
    3e10:	00 10                	add    %dl,(%rax)
    3e12:	00 00                	add    %al,(%rax)
    3e14:	00 00                	add    %al,(%rax)
    3e16:	00 00                	add    %al,(%rax)
    3e18:	0d 00 00 00 00       	or     $0x0,%eax
    3e1d:	00 00                	add    %al,(%rax)
    3e1f:	00 d8                	add    %bl,%al
    3e21:	11 00                	adc    %eax,(%rax)
    3e23:	00 00                	add    %al,(%rax)
    3e25:	00 00                	add    %al,(%rax)
    3e27:	00 19                	add    %bl,(%rcx)
    3e29:	00 00                	add    %al,(%rax)
    3e2b:	00 00                	add    %al,(%rax)
    3e2d:	00 00                	add    %al,(%rax)
    3e2f:	00 e8                	add    %ch,%al
    3e31:	3d 00 00 00 00       	cmp    $0x0,%eax
    3e36:	00 00                	add    %al,(%rax)
    3e38:	1b 00                	sbb    (%rax),%eax
    3e3a:	00 00                	add    %al,(%rax)
    3e3c:	00 00                	add    %al,(%rax)
    3e3e:	00 00                	add    %al,(%rax)
    3e40:	08 00                	or     %al,(%rax)
    3e42:	00 00                	add    %al,(%rax)
    3e44:	00 00                	add    %al,(%rax)
    3e46:	00 00                	add    %al,(%rax)
    3e48:	1a 00                	sbb    (%rax),%al
    3e4a:	00 00                	add    %al,(%rax)
    3e4c:	00 00                	add    %al,(%rax)
    3e4e:	00 00                	add    %al,(%rax)
    3e50:	f0 3d 00 00 00 00    	lock cmp $0x0,%eax
    3e56:	00 00                	add    %al,(%rax)
    3e58:	1c 00                	sbb    $0x0,%al
    3e5a:	00 00                	add    %al,(%rax)
    3e5c:	00 00                	add    %al,(%rax)
    3e5e:	00 00                	add    %al,(%rax)
    3e60:	08 00                	or     %al,(%rax)
    3e62:	00 00                	add    %al,(%rax)
    3e64:	00 00                	add    %al,(%rax)
    3e66:	00 00                	add    %al,(%rax)
    3e68:	f5                   	cmc    
    3e69:	fe                   	(bad)  
    3e6a:	ff 6f 00             	ljmp   *0x0(%rdi)
    3e6d:	00 00                	add    %al,(%rax)
    3e6f:	00 c0                	add    %al,%al
    3e71:	03 00                	add    (%rax),%eax
    3e73:	00 00                	add    %al,(%rax)
    3e75:	00 00                	add    %al,(%rax)
    3e77:	00 05 00 00 00 00    	add    %al,0x0(%rip)        # 3e7d <_DYNAMIC+0x85>
    3e7d:	00 00                	add    %al,(%rax)
    3e7f:	00 88 04 00 00 00    	add    %cl,0x4(%rax)
    3e85:	00 00                	add    %al,(%rax)
    3e87:	00 06                	add    %al,(%rsi)
    3e89:	00 00                	add    %al,(%rax)
    3e8b:	00 00                	add    %al,(%rax)
    3e8d:	00 00                	add    %al,(%rax)
    3e8f:	00 e0                	add    %ah,%al
    3e91:	03 00                	add    (%rax),%eax
    3e93:	00 00                	add    %al,(%rax)
    3e95:	00 00                	add    %al,(%rax)
    3e97:	00 0a                	add    %cl,(%rdx)
    3e99:	00 00                	add    %al,(%rax)
    3e9b:	00 00                	add    %al,(%rax)
    3e9d:	00 00                	add    %al,(%rax)
    3e9f:	00 84 00 00 00 00 00 	add    %al,0x0(%rax,%rax,1)
    3ea6:	00 00                	add    %al,(%rax)
    3ea8:	0b 00                	or     (%rax),%eax
    3eaa:	00 00                	add    %al,(%rax)
    3eac:	00 00                	add    %al,(%rax)
    3eae:	00 00                	add    %al,(%rax)
    3eb0:	18 00                	sbb    %al,(%rax)
    3eb2:	00 00                	add    %al,(%rax)
    3eb4:	00 00                	add    %al,(%rax)
    3eb6:	00 00                	add    %al,(%rax)
    3eb8:	15 00 00 00 00       	adc    $0x0,%eax
	...
    3ec5:	00 00                	add    %al,(%rax)
    3ec7:	00 03                	add    %al,(%rbx)
	...
    3ed1:	40 00 00             	rex add %al,(%rax)
    3ed4:	00 00                	add    %al,(%rax)
    3ed6:	00 00                	add    %al,(%rax)
    3ed8:	02 00                	add    (%rax),%al
    3eda:	00 00                	add    %al,(%rax)
    3edc:	00 00                	add    %al,(%rax)
    3ede:	00 00                	add    %al,(%rax)
    3ee0:	18 00                	sbb    %al,(%rax)
    3ee2:	00 00                	add    %al,(%rax)
    3ee4:	00 00                	add    %al,(%rax)
    3ee6:	00 00                	add    %al,(%rax)
    3ee8:	14 00                	adc    $0x0,%al
    3eea:	00 00                	add    %al,(%rax)
    3eec:	00 00                	add    %al,(%rax)
    3eee:	00 00                	add    %al,(%rax)
    3ef0:	07                   	(bad)  
    3ef1:	00 00                	add    %al,(%rax)
    3ef3:	00 00                	add    %al,(%rax)
    3ef5:	00 00                	add    %al,(%rax)
    3ef7:	00 17                	add    %dl,(%rdi)
	...
    3f01:	06                   	(bad)  
    3f02:	00 00                	add    %al,(%rax)
    3f04:	00 00                	add    %al,(%rax)
    3f06:	00 00                	add    %al,(%rax)
    3f08:	07                   	(bad)  
    3f09:	00 00                	add    %al,(%rax)
    3f0b:	00 00                	add    %al,(%rax)
    3f0d:	00 00                	add    %al,(%rax)
    3f0f:	00 40 05             	add    %al,0x5(%rax)
    3f12:	00 00                	add    %al,(%rax)
    3f14:	00 00                	add    %al,(%rax)
    3f16:	00 00                	add    %al,(%rax)
    3f18:	08 00                	or     %al,(%rax)
    3f1a:	00 00                	add    %al,(%rax)
    3f1c:	00 00                	add    %al,(%rax)
    3f1e:	00 00                	add    %al,(%rax)
    3f20:	c0 00 00             	rolb   $0x0,(%rax)
    3f23:	00 00                	add    %al,(%rax)
    3f25:	00 00                	add    %al,(%rax)
    3f27:	00 09                	add    %cl,(%rcx)
    3f29:	00 00                	add    %al,(%rax)
    3f2b:	00 00                	add    %al,(%rax)
    3f2d:	00 00                	add    %al,(%rax)
    3f2f:	00 18                	add    %bl,(%rax)
    3f31:	00 00                	add    %al,(%rax)
    3f33:	00 00                	add    %al,(%rax)
    3f35:	00 00                	add    %al,(%rax)
    3f37:	00 fb                	add    %bh,%bl
    3f39:	ff                   	(bad)  
    3f3a:	ff 6f 00             	ljmp   *0x0(%rdi)
    3f3d:	00 00                	add    %al,(%rax)
    3f3f:	00 00                	add    %al,(%rax)
    3f41:	00 00                	add    %al,(%rax)
    3f43:	08 00                	or     %al,(%rax)
    3f45:	00 00                	add    %al,(%rax)
    3f47:	00 fe                	add    %bh,%dh
    3f49:	ff                   	(bad)  
    3f4a:	ff 6f 00             	ljmp   *0x0(%rdi)
    3f4d:	00 00                	add    %al,(%rax)
    3f4f:	00 20                	add    %ah,(%rax)
    3f51:	05 00 00 00 00       	add    $0x0,%eax
    3f56:	00 00                	add    %al,(%rax)
    3f58:	ff                   	(bad)  
    3f59:	ff                   	(bad)  
    3f5a:	ff 6f 00             	ljmp   *0x0(%rdi)
    3f5d:	00 00                	add    %al,(%rax)
    3f5f:	00 01                	add    %al,(%rcx)
    3f61:	00 00                	add    %al,(%rax)
    3f63:	00 00                	add    %al,(%rax)
    3f65:	00 00                	add    %al,(%rax)
    3f67:	00 f0                	add    %dh,%al
    3f69:	ff                   	(bad)  
    3f6a:	ff 6f 00             	ljmp   *0x0(%rdi)
    3f6d:	00 00                	add    %al,(%rax)
    3f6f:	00 0c 05 00 00 00 00 	add    %cl,0x0(,%rax,1)
    3f76:	00 00                	add    %al,(%rax)
    3f78:	f9                   	stc    
    3f79:	ff                   	(bad)  
    3f7a:	ff 6f 00             	ljmp   *0x0(%rdi)
    3f7d:	00 00                	add    %al,(%rax)
    3f7f:	00 03                	add    %al,(%rbx)
	...

Disassembly of section .got:

0000000000003fd8 <.got>:
	...

Disassembly of section .got.plt:

0000000000004000 <_GLOBAL_OFFSET_TABLE_>:
    4000:	f8                   	clc    
    4001:	3d 00 00 00 00       	cmp    $0x0,%eax
	...
    4016:	00 00                	add    %al,(%rax)
    4018:	36 10 00             	ss adc %al,(%rax)
    401b:	00 00                	add    %al,(%rax)
    401d:	00 00                	add    %al,(%rax)
	...

Disassembly of section .data:

0000000000004020 <__data_start>:
	...

0000000000004028 <__dso_handle>:
    4028:	28 40 00             	sub    %al,0x0(%rax)
    402b:	00 00                	add    %al,(%rax)
    402d:	00 00                	add    %al,(%rax)
	...

Disassembly of section .bss:

0000000000004030 <completed.0>:
	...

 

objdump로  disassemble 해보았다.

 

다 필요없고 .text .rodata 만 보자.

Disassembly of section .plt:

0000000000001020 <printf@plt-0x10>:
    1020:	ff 35 e2 2f 00 00    	push   0x2fe2(%rip)        # 4008 <_GLOBAL_OFFSET_TABLE_+0x8>
    1026:	ff 25 e4 2f 00 00    	jmp    *0x2fe4(%rip)        # 4010 <_GLOBAL_OFFSET_TABLE_+0x10>
    102c:	0f 1f 40 00          	nopl   0x0(%rax)

0000000000001030 <printf@plt>:
    1030:	ff 25 e2 2f 00 00    	jmp    *0x2fe2(%rip)        # 4018 <printf@GLIBC_2.2.5>
    1036:	68 00 00 00 00       	push   $0x0
    103b:	e9 e0 ff ff ff       	jmp    1020 <_init+0x20>
    
    Disassembly of section .text:

0000000000001040 <_start>:
    1040:	f3 0f 1e fa          	endbr64 
    1044:	31 ed                	xor    %ebp,%ebp
    1046:	49 89 d1             	mov    %rdx,%r9
    1049:	5e                   	pop    %rsi
    104a:	48 89 e2             	mov    %rsp,%rdx
    104d:	48 83 e4 f0          	and    $0xfffffffffffffff0,%rsp
    1051:	50                   	push   %rax
    1052:	54                   	push   %rsp
    1053:	4c 8d 05 76 01 00 00 	lea    0x176(%rip),%r8        # 11d0 <__libc_csu_fini>
    105a:	48 8d 0d ff 00 00 00 	lea    0xff(%rip),%rcx        # 1160 <__libc_csu_init>
    1061:	48 8d 3d d1 00 00 00 	lea    0xd1(%rip),%rdi        # 1139 <main>
    1068:	ff 15 72 2f 00 00    	call   *0x2f72(%rip)        # 3fe0 <__libc_start_main@GLIBC_2.2.5>
    106e:	f4                   	hlt    
    106f:	90                   	nop

0000000000001139 <main>:
    1139:	55                   	push   %rbp
    113a:	48 89 e5             	mov    %rsp,%rbp
    113d:	48 8d 05 c0 0e 00 00 	lea    0xec0(%rip),%rax        # 2004 <_IO_stdin_used+0x4>
    1144:	48 89 c7             	mov    %rax,%rdi
    1147:	b8 00 00 00 00       	mov    $0x0,%eax
    114c:	e8 df fe ff ff       	call   1030 <printf@plt>
    1151:	b8 00 00 00 00       	mov    $0x0,%eax
    1156:	5d                   	pop    %rbp
    1157:	c3                   	ret    
    1158:	0f 1f 84 00 00 00 00 	nopl   0x0(%rax,%rax,1)
    115f:	00
    
Disassembly of section .rodata:

0000000000002000 <_IO_stdin_used>:
    2000:	01 00                	add    %eax,(%rax)
    2002:	02 00                	add    (%rax),%al
    2004:	48                   	rex.W
    2005:	65 6c                	gs insb (%dx),%es:(%rdi)
    2007:	6c                   	insb   (%dx),%es:(%rdi)
    2008:	6f                   	outsl  %ds:(%rsi),(%dx)
    2009:	20 57 6f             	and    %dl,0x6f(%rdi)
    200c:	72 6c                	jb     207a <__GNU_EH_FRAME_HDR+0x66>
    200e:	64 21 00             	and    %eax,%fs:(%rax)

Disassembly of section .eh_frame_hdr:

0000000000002014 <__GNU_EH_FRAME_HDR>:
    2014:	01 1b                	add    %ebx,(%rbx)
    2016:	03 3b                	add    (%rbx),%edi
    2018:	30 00                	xor    %al,(%rax)
    201a:	00 00                	add    %al,(%rax)
    201c:	05 00 00 00 0c       	add    $0xc000000,%eax
    2021:	f0 ff                	lock (bad) 
    2023:	ff 64 00 00          	jmp    *0x0(%rax,%rax,1)
    2027:	00 2c f0             	add    %ch,(%rax,%rsi,8)
    202a:	ff                   	(bad)  
    202b:	ff 4c 00 00          	decl   0x0(%rax,%rax,1)
    202f:	00 25 f1 ff ff 8c    	add    %ah,-0x7300000f(%rip)        # ffffffff8d002026 <_end+0xffffffff8cffdfee>
    2035:	00 00                	add    %al,(%rax)
    2037:	00 4c f1 ff          	add    %cl,-0x1(%rcx,%rsi,8)
    203b:	ff ac 00 00 00 bc f1 	ljmp   *-0xe440000(%rax,%rax,1)
    2042:	ff                   	(bad)  
    2043:	ff f4                	push   %rsp
    2045:	00 00                	add    %al,(%rax)
	...

 

이때까지 배운 것과 많이 다르다.

linux 에 의한 여러 동작까지 같이 프로그래밍 되었기 때문이다.

프로그램의 main() 시작, main() 종료에 관련된 Section 또한 수정본에는 적지 않았다.

deregister_tm_clones, __libc_csu_init, frame_dummy 등등

관련 내용이 알고 싶으면 Assembly Section 에 대해 적은 글을 참고하자. (준비중)

 

start를 보면 endbr64 라는 것이 있다.

"End Branch 64 bit"의 약자이다.

64비트에서 간접 분기를 종료한다.

ENDBRANCH는 새로 나온 명령어로서 CET를 지원하지 않는 레거시 시스템에서는 지원하지 않는다.

opcode는 CET가 지원되지 않는 경우 명령이 무시되도록 no-op으로 치환된다.

간접 분기 추적이 비활성화된 CET 가능 프로세서에서도 동일한 일이 발생한다.

 

main를 보면 call <printf@plt>가 있다.

plt 섹션에서 프로시저를 호출(call)하겠다는 말이다.

 

plt를 보면 jb가 있다.

jb는 Operand 1의 값이 1일 경우 Operand 2의 메모리 주소로 분기(jump)하는 명령어이다.

 

 

반응형

'개발 > Assembly' 카테고리의 다른 글

UNIX 운영체제 System Call  (0) 2022.02.20
RISC vs CISC 차이 - Processor  (2) 2022.02.03