x86 리눅스에서 ARM 리눅스용 vmlinux 디스어셈블하기

Phonedolly·2021년 5월 6일
0

linux

목록 보기
3/7

objdumpvmlinux를 디스어셈블할 수 있지만, objdump는 기본적으로 해당 시스템의 아키텍처에 종속적이다. 예를 들어 x86_64 시스템에선 ARM 버전의 vmlinux를 다룰 때 문제가 발생한다.

ARM 버전의 vmlinux를 잘 디스어셈블해보자.

GNU Toolchain 받기

ARM에서 제공하는 GNU Toolchain을 받자. 위 주소로 접속하여 각자 환경에 맞는 파일을 다운로드한다. 나의 경우 x86_64 리눅스에서 armeabihf 프로세서용 vmlinux를 다룰 예정이므로 AArch32 target with hard float (arm-linux-none-gnueabihf) 버전을 받았다.

objdump 뽑아내기

압축을 풀면 다음 경로에 objdump가 위치한다.

gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/bin/objdump

objdump로 ARM 리눅스용 vmlinux를 디스어셈블할 수 있다.

디스어셈블 해보기

__irq_svc 인터럽트 벡터를 디스어셈블해보자.

우선 System.map에서 __irq_svc 심볼의 address를 찾는다.

/* System.map */

...
801018bc t common_invalid
801018e0 t __dabt_svc
80101960 t __irq_svc
801019dc t __und_fault
80101a00 t __und_svc
80101a60 t __und_svc_fault
80101a68 t __und_svc_finish
...

여기서는 0x80101960__irq_svc 심볼이 위치한다.
이제 vmlinux 일부를 디스어셈블해보자.

objdump -d vmlinux --start-address=0x80101960 --stop-address=0x801019dc > __irq_svc.S

이제 __irq_svc의 어셈블리 코드를 볼 수 있다.


vmlinux:     file format elf32-littlearm


Disassembly of section .text:

80101960 <__irq_svc>:
80101960:	e24dd04c 	sub	sp, sp, #76	; 0x4c
80101964:	e31d0004 	tst	sp, #4
80101968:	024dd004 	subeq	sp, sp, #4
8010196c:	e88d1ffe 	stm	sp, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}
80101970:	e8900038 	ldm	r0, {r3, r4, r5}
80101974:	e28d7030 	add	r7, sp, #48	; 0x30
80101978:	e3e06000 	mvn	r6, #0
8010197c:	e28d204c 	add	r2, sp, #76	; 0x4c
80101980:	02822004 	addeq	r2, r2, #4
80101984:	e52d3004 	push	{r3}		; (str r3, [sp, #-4]!)
80101988:	e1a0300e 	mov	r3, lr
8010198c:	e887007c 	stm	r7, {r2, r3, r4, r5, r6}
80101990:	e1a096ad 	lsr	r9, sp, #13
80101994:	e1a09689 	lsl	r9, r9, #13
80101998:	e5991008 	ldr	r1, [r9, #8]
8010199c:	e3a0247f 	mov	r2, #2130706432	; 0x7f000000
801019a0:	e5892008 	str	r2, [r9, #8]
801019a4:	e58d104c 	str	r1, [sp, #76]	; 0x4c
801019a8:	eb0412a9 	bl	80206454 <trace_hardirqs_off>
801019ac:	e59f1024 	ldr	r1, [pc, #36]	; 801019d8 <__irq_svc+0x78>
801019b0:	e1a0000d 	mov	r0, sp
801019b4:	e28fe000 	add	lr, pc, #0
801019b8:	e591f000 	ldr	pc, [r1]
801019bc:	eb0411f7 	bl	802061a0 <trace_hardirqs_on>
801019c0:	e59d104c 	ldr	r1, [sp, #76]	; 0x4c
801019c4:	e5891008 	str	r1, [r9, #8]
801019c8:	e16ff005 	msr	SPSR_fsxc, r5
801019cc:	e24d0004 	sub	r0, sp, #4
801019d0:	e1801f92 	strex	r1, r2, [r0]
801019d4:	e8ddffff 	ldm	sp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr, pc}^
801019d8:	80aef210 	.word	0x80aef210

0개의 댓글