รวมถึงคำสั่งที่คุณใช้ไปแล้วฉันจะพยายามอย่างดีที่สุดเพื่อให้รายละเอียดสิ่งที่สามารถทำได้เพื่อดำเนินการทางนิติวิทยาศาสตร์ในไฟล์ปฏิบัติการ
strings
คำสั่งอ่อนน้อมถ่อมตนจะมีประโยชน์ในการเห็นภาพข้อความผิดพลาดซึ่งให้คำแนะนำของฟังก์ชันไบนารี นอกจากนี้ยังเป็นวิธีที่ง่ายในการตรวจจับไบนารีที่บรรจุไว้ในตัวอย่าง (บ่อยครั้งที่มีไบนารีของมัลแวร์):
$strings exe_file
UPX!
...
PROT_EXEC|PROT_WRITE failed.
$Info: This file is packed with the UPX executable packer http://upx.sf.net $
$Id: UPX 3.91 Copyright (C) 1996-2013 the UPX Team. All Rights Reserved. $
...
UPX!
strings - พิมพ์สตริงของตัวอักษรที่พิมพ์ได้ในไฟล์
สำหรับแต่ละไฟล์ที่กำหนดสตริง GNU พิมพ์ลำดับอักขระที่พิมพ์ได้ที่มีความยาวอย่างน้อย 4 ตัวอักษร (หรือตัวเลขที่กำหนดด้วยตัวเลือกด้านล่าง) และตามด้วยอักขระที่ไม่สามารถพิมพ์ได้
file
อนุญาตให้ดูคุณสมบัติที่สามารถใช้งานได้ ได้แก่ :
- สถาปัตยกรรมเป้าหมาย
- ระบบปฏิบัติการ;
- หากเชื่อมโยงแบบไดนามิกหรือแบบคงที่;
- ถ้าคอมไพล์ด้วยข้อมูลการดีบักหรือไม่
ในตัวอย่างนี้ "not stripped" แสดงว่าคอมไพล์ด้วยข้อมูลการดีบัก
$ file exe_file
exe_file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=6f4c5f003e19c7a4bbacb30af3e84a41c88fc0d9, not stripped
file
ทดสอบแต่ละอาร์กิวเมนต์ในความพยายามที่จะจำแนกมัน มีการทดสอบสามชุดดำเนินการตามลำดับนี้: การทดสอบระบบไฟล์การทดสอบเวทย์มนตร์และการทดสอบภาษา การทดสอบครั้งแรกที่ประสบความสำเร็จเป็นสาเหตุให้พิมพ์ไฟล์
objdump
สร้างรายการ disassembly ของไฟล์เรียกทำงาน:
$ objdump -d exe_file
ls: file format Mach-O 64-bit x86-64
Disassembly of section __TEXT,__text:
__text:
100000f20: 55 pushq %rbp
100000f21: 48 89 e5 movq %rsp, %rbp
100000f24: 48 83 c7 68 addq $104, %rdi
100000f28: 48 83 c6 68 addq $104, %rsi
100000f2c: 5d popq %rbp
100000f2d: e9 58 36 00 00 jmp 13912
100000f32: 55 pushq %rbp
100000f33: 48 89 e5 movq %rsp, %rbp
100000f36: 48 8d 46 68 leaq 104(%rsi), %rax
100000f3a: 48 8d 77 68 leaq 104(%rdi), %rsi
...............
objdump
ยังอนุญาตให้รู้ว่าคอมไพเลอร์ที่ใช้ในการรวบรวมปฏิบัติการไบนารี:
$ objdump -s --section .comment exe_file
exe_file: file format elf64-x86-64
Contents of section .comment:
0000 4743433a 2028474e 55292034 2e342e37 GCC: (GNU) 4.4.7
0010 20323031 32303331 33202852 65642048 20120313 (Red H
0020 61742034 2e342e37 2d313129 00 at 4.4.7-11).
objdump
แสดงรายการฟังก์ชั่นภายนอกแบบไดนามิกที่เชื่อมโยงในเวลาทำงาน:
$ objdump -T exe_file
true: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __uflow
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 getenv
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 free
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 abort
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __errno_location
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 strncmp
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 _exit
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __fpending
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 textdomain
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fclose
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 bindtextdomain
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 dcgettext
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __ctype_get_mb_cur_max
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 strlen
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.4 __stack_chk_fail
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 mbrtowc
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 strrchr
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 lseek
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 memset
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fscanf
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 close
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __libc_start_main
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 memcmp
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fputs_unlocked
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 calloc
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 strcmp
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.14 memcpy
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fileno
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 malloc
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fflush
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 nl_langinfo
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 ungetc
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __freading
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 realloc
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fdopen
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 setlocale
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3.4 __printf_chk
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 error
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 open
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fseeko
0000000000000000 w D *UND* 0000000000000000 _Jv_RegisterClasses
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __cxa_atexit
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 exit
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fwrite
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3.4 __fprintf_chk
0000000000000000 w D *UND* 0000000000000000 _ITM_registerTMCloneTable
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 mbsinit
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 iswprint
0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.2.5 __cxa_finalize
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3 __ctype_b_loc
0000000000207228 g DO .bss 0000000000000008 GLIBC_2.2.5 stdout
0000000000207220 g DO .bss 0000000000000008 GLIBC_2.2.5 __progname
0000000000207230 w DO .bss 0000000000000008 GLIBC_2.2.5 program_invocation_name
0000000000207230 g DO .bss 0000000000000008 GLIBC_2.2.5 __progname_full
0000000000207220 w DO .bss 0000000000000008 GLIBC_2.2.5 program_invocation_short_name
0000000000207240 g DO .bss 0000000000000008 GLIBC_2.2.5 stderr
objdump
แสดงข้อมูลเกี่ยวกับไฟล์ออบเจ็กต์หนึ่งไฟล์ขึ้นไป ตัวเลือกควบคุมข้อมูลเฉพาะที่จะแสดง ข้อมูลนี้ส่วนใหญ่มีประโยชน์สำหรับโปรแกรมเมอร์ที่กำลังทำงานกับเครื่องมือการรวบรวมซึ่งตรงข้ามกับโปรแกรมเมอร์ที่ต้องการให้โปรแกรมรวบรวมและทำงาน
คุณสามารถเรียกใช้ไบนารีใน VM ที่สร้างขึ้นแล้วทิ้งไปเพียงเพื่อจุดประสงค์ในการใช้งานไบนารี การใช้งานstrace
, ltrace
, gdb
และsysdig
เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับสิ่งที่ไบนารีจะทำระบบเรียกระดับในเวลาทำงาน
$strace exe_file
open("/opt/sms/AU/mo/tmp.RqBcjY", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
open("/opt/sms/AU/mo/tmp.PhHkOr", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
open("/opt/sms/AU/mo/tmp.q4MtjV", O_RDWR|O_CREAT|O_EXCL, 0600) = 5
strace
รันคำสั่งที่ระบุจนกว่าจะออก มันสกัดกั้นและบันทึกการเรียกของระบบซึ่งถูกเรียกใช้โดยกระบวนการและสัญญาณที่ได้รับจากกระบวนการ ชื่อของการเรียกระบบแต่ละครั้งอาร์กิวเมนต์และค่าส่งคืนจะถูกพิมพ์ตามข้อผิดพลาดมาตรฐานหรือไปยังไฟล์ที่ระบุด้วยตัวเลือก -o
$ltrace exe_file
_libc_start_main(0x400624, 1, 0x7ffcb7b6d7c8, 0x400710 <unfinished ...>
time(0) = 1508018406
srand(0x59e288e6, 0x7ffcb7b6d7c8, 0x7ffcb7b6d7d8, 0) = 0
sprintf("mkdir -p -- '/opt/sms/AU/mo'", "mkdir -p -- '%s'", "/opt/sms/AU/mo") = 28
system("mkdir -p -- '/opt/sms/AU/mo'" <no return ...>
--- SIGCHLD (Child exited) ---
<... system resumed> ) = 0
rand(2, 0x7ffcb7b6d480, 0, 0x7f9d6d4622b0) = 0x2d8ddbe1
sprintf("/opt/sms/AU/mo/tmp.XXXXXX", "%s/tmp.XXXXXX", "/opt/sms/AU/mo") = 29
mkstemp(0x7ffcb7b6d5c0, 0x40080b, 0x40081a, 0x7ffffff1) = 3
sprintf("/opt/sms/AU/mo/tmp.XXXXXX", "%s/tmp.XXXXXX", "/opt/sms/AU/mo") = 29
mkstemp(0x7ffcb7b6d5c0, 0x40080b, 0x40081a, 0x7ffffff1) = 4
+++ exited (status 0) +++
ltrace
เป็นโปรแกรมที่เรียกใช้คำสั่งที่ระบุจนกว่าจะออก มันสกัดกั้นและบันทึกการเรียกไลบรารีแบบไดนามิกซึ่งถูกเรียกใช้โดยกระบวนการที่ดำเนินการและสัญญาณที่ได้รับจากกระบวนการนั้น นอกจากนี้ยังสามารถดักจับและพิมพ์การเรียกของระบบที่ดำเนินการโดยโปรแกรม
gdb
นอกจากนี้ยังสามารถบั๊กขั้นตอนโดยขั้นตอนที่มี
วัตถุประสงค์ของโปรแกรมดีบั๊กเช่น GDB คือให้คุณดูว่าเกิดอะไรขึ้นกับโปรแกรม '' ข้างใน '' ในขณะที่มันทำงาน
ในการติดตาม / สร้างดัมพ์ของกิจกรรมระบบส่วนใหญ่ที่รันอยู่ให้ใช้ sysdig ดังเช่น:
#sudo sysdig proc.name=exe_file
……………….
11569 19:05:40.938743330 1 exe_file (35690) > getpid
11570 19:05:40.938744605 1 exe_file (35690) < getpid
11571 19:05:40.938749018 1 exe_file (35690) > open
11572 19:05:40.938801508 1 exe_file (35690) < open fd=3(<f>/opt/sms/AU/mo/tmp.MhVlrl) name=/opt/sms/AU/mo/tmp.XXXXMhVlrl flags=39(O_EXCL|O_CREAT|O_RDWR) mode=0
11573 19:05:40.938811276 1 exe_file (35690) > getpid
11574 19:05:40.938812431 1 exe_file (35690) < getpid
11575 19:05:40.938813171 1 exe_file (35690) > open
11576 19:05:40.938826313 1 exe_file (35690) < open fd=4(<f>/opt/sms/AU/mo/tmp.5tlBSs) name=/opt/sms/AU/mo/tmp.5tlBSs flags=39(O_EXCL|O_CREAT|O_RDWR) mode=0
11577 19:05:40.938848592 1 exe_file (35690) > getpid
11578 19:05:40.938849139 1 exe_file (35690) < getpid
11579 19:05:40.938849728 1 exe_file (35690) > open
11580 19:05:40.938860629 1 exe_file (35690) < open fd=5(<f>/opt/sms/AU/mo/tmp.CJWQjA) name=/opt/sms/AU/mo/tmp.CJWQjA flags=39(O_EXCL|O_CREAT|O_RDWR) mode=0
sysdig
เป็นเครื่องมือสำหรับการแก้ไขปัญหาการวิเคราะห์และการใช้ประโยชน์ มันสามารถใช้ในการจับภาพกรองและถอดรหัสการโทรของระบบและเหตุการณ์อื่น ๆ ของระบบปฏิบัติการ sysdig สามารถใช้ในการตรวจสอบระบบสดหรือสร้างไฟล์ติดตามที่สามารถวิเคราะห์ได้ในภายหลัง
sysdig มีภาษาการกรองที่ทรงพลังมีเอาต์พุตที่ปรับแต่งได้และสามารถขยายผ่านสคริปต์ Lua หรือที่เรียกว่าสิ่ว
เราจะจัดการอีกครั้งกับการวิเคราะห์แบบคงที่ของไฟล์ไบนารีตัวเองในส่วนที่เหลือของคำตอบนี้
ldd exe_file
แสดงรายการไลบรารีที่ใช้
$ ldd exe_file
linux-vdso.so.1 (0x00007ffdf83bd000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f14d9b32000)
/lib64/ld-linux-x86-64.so.2 (0x000055ededaea000)
ldd
พิมพ์อ็อบเจ็กต์ที่แบ่งใช้ (ไลบรารีที่แบ่งใช้) ที่ต้องการโดยแต่ละโปรแกรมหรืออ็อบเจ็กต์ที่แบ่งใช้ที่ระบุไว้บนบรรทัดรับคำสั่ง
size -A exe_file
$ size -A exe_file
exe_file :
section size addr
.interp 28 4194816
.note.ABI-tag 32 4194844
.note.gnu.build-id 36 4194876
.gnu.hash 28 4194912
.dynsym 216 4194944
.dynstr 90 4195160
.gnu.version 18 4195250
.gnu.version_r 32 4195272
.rela.dyn 24 4195304
.rela.plt 168 4195328
.init 24 4195496
.plt 128 4195520
.text 664 4195648
.fini 14 4196312
.rodata 51 4196328
.eh_frame_hdr 36 4196380
.eh_frame 124 4196416
.ctors 16 6293696
.dtors 16 6293712
.jcr 8 6293728
.dynamic 400 6293736
.got 8 6294136
.got.plt 80 6294144
.data 4 6294224
.bss 16 6294232
.comment 45 0
Total 2306
$ size -d ls
text data bss dec hex filename
122678 4664 4552 131894 20336 ls
size
ยูทิลิตีGNU แสดงรายการขนาดส่วน --- และขนาดทั้งหมด --- สำหรับไฟล์ออบเจ็กต์หรือไฟล์เก็บถาวร objfile ในรายการอาร์กิวเมนต์ ตามค่าดีฟอลต์แล้วเอาต์พุตหนึ่งบรรทัดจะถูกสร้างขึ้นสำหรับแต่ละอ็อบเจ็กต์ไฟล์หรือแต่ละโมดูลในไฟล์เก็บถาวร
readelf -x .rodata exe_file
แสดงรายการสตริงแบบคงที่
$ readelf -x .rodata exe_file
Hex dump of section '.rodata':
0x004007e8 01000200 00000000 00000000 00000000 ................
0x004007f8 6d6b6469 72202d70 202d2d20 27257327 mkdir -p -- '%s'
0x00400808 0025732f 746d702e 58585858 58585858 .%s/tmp.XXXXXXXX
0x00400818 585800 XX.
readelf -h exe_file
รับข้อมูลส่วนหัวของ ELF
$ readelf -h exe_file
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x400540
Start of program headers: 64 (bytes into file)
Start of section headers: 3072 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 8
Size of section headers: 64 (bytes)
Number of section headers: 30
Section header string table index: 27
readelf -s exe_file
แสดงสัญลักษณ์
$ readelf -s exe_file
Symbol table '.dynsym' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND system@GLIBC_2.2.5 (2)
4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sprintf@GLIBC_2.2.5 (2)
5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mkstemp@GLIBC_2.2.5 (2)
6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND srand@GLIBC_2.2.5 (2)
7: 0000000000000000 0 FUNC GLOBAL DEFAULT UND rand@GLIBC_2.2.5 (2)
8: 0000000000000000 0 FUNC GLOBAL DEFAULT UND time@GLIBC_2.2.5 (2)
Symbol table '.symtab' contains 69 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000400200 0 SECTION LOCAL DEFAULT 1
2: 000000000040021c 0 SECTION LOCAL DEFAULT 2
3: 000000000040023c 0 SECTION LOCAL DEFAULT 3
4: 0000000000400260 0 SECTION LOCAL DEFAULT 4
5: 0000000000400280 0 SECTION LOCAL DEFAULT 5
6: 0000000000400358 0 SECTION LOCAL DEFAULT 6
7: 00000000004003b2 0 SECTION LOCAL DEFAULT 7
8: 00000000004003c8 0 SECTION LOCAL DEFAULT 8
9: 00000000004003e8 0 SECTION LOCAL DEFAULT 9
10: 0000000000400400 0 SECTION LOCAL DEFAULT 10
11: 00000000004004a8 0 SECTION LOCAL DEFAULT 11
12: 00000000004004c0 0 SECTION LOCAL DEFAULT 12
13: 0000000000400540 0 SECTION LOCAL DEFAULT 13
14: 00000000004007d8 0 SECTION LOCAL DEFAULT 14
15: 00000000004007e8 0 SECTION LOCAL DEFAULT 15
16: 000000000040081c 0 SECTION LOCAL DEFAULT 16
17: 0000000000400840 0 SECTION LOCAL DEFAULT 17
18: 00000000006008c0 0 SECTION LOCAL DEFAULT 18
19: 00000000006008d0 0 SECTION LOCAL DEFAULT 19
20: 00000000006008e0 0 SECTION LOCAL DEFAULT 20
21: 00000000006008e8 0 SECTION LOCAL DEFAULT 21
22: 0000000000600a78 0 SECTION LOCAL DEFAULT 22
23: 0000000000600a80 0 SECTION LOCAL DEFAULT 23
24: 0000000000600ad0 0 SECTION LOCAL DEFAULT 24
25: 0000000000600ad8 0 SECTION LOCAL DEFAULT 25
26: 0000000000000000 0 SECTION LOCAL DEFAULT 26
27: 000000000040056c 0 FUNC LOCAL DEFAULT 13 call_gmon_start
28: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
29: 00000000006008c0 0 OBJECT LOCAL DEFAULT 18 __CTOR_LIST__
30: 00000000006008d0 0 OBJECT LOCAL DEFAULT 19 __DTOR_LIST__
31: 00000000006008e0 0 OBJECT LOCAL DEFAULT 20 __JCR_LIST__
32: 0000000000400590 0 FUNC LOCAL DEFAULT 13 __do_global_dtors_aux
33: 0000000000600ad8 1 OBJECT LOCAL DEFAULT 25 completed.6349
34: 0000000000600ae0 8 OBJECT LOCAL DEFAULT 25 dtor_idx.6351
35: 0000000000400600 0 FUNC LOCAL DEFAULT 13 frame_dummy
36: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
37: 00000000006008c8 0 OBJECT LOCAL DEFAULT 18 __CTOR_END__
38: 00000000004008b8 0 OBJECT LOCAL DEFAULT 17 __FRAME_END__
39: 00000000006008e0 0 OBJECT LOCAL DEFAULT 20 __JCR_END__
40: 00000000004007a0 0 FUNC LOCAL DEFAULT 13 __do_global_ctors_aux
41: 0000000000000000 0 FILE LOCAL DEFAULT ABS exe_file.c
42: 0000000000600a80 0 OBJECT LOCAL DEFAULT 23 _GLOBAL_OFFSET_TABLE_
43: 00000000006008bc 0 NOTYPE LOCAL DEFAULT 18 __init_array_end
44: 00000000006008bc 0 NOTYPE LOCAL DEFAULT 18 __init_array_start
45: 00000000006008e8 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC
46: 0000000000600ad0 0 NOTYPE WEAK DEFAULT 24 data_start
47: 0000000000400700 2 FUNC GLOBAL DEFAULT 13 __libc_csu_fini
48: 0000000000400540 0 FUNC GLOBAL DEFAULT 13 _start
49: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
50: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses
51: 00000000004007d8 0 FUNC GLOBAL DEFAULT 14 _fini
52: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
53: 0000000000000000 0 FUNC GLOBAL DEFAULT UND system@@GLIBC_2.2.5
54: 00000000004007e8 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used
55: 0000000000600ad0 0 NOTYPE GLOBAL DEFAULT 24 __data_start
56: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sprintf@@GLIBC_2.2.5
57: 00000000004007f0 0 OBJECT GLOBAL HIDDEN 15 __dso_handle
58: 00000000006008d8 0 OBJECT GLOBAL HIDDEN 19 __DTOR_END__
59: 0000000000400710 137 FUNC GLOBAL DEFAULT 13 __libc_csu_init
60: 0000000000600ad4 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
61: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mkstemp@@GLIBC_2.2.5
62: 0000000000000000 0 FUNC GLOBAL DEFAULT UND srand@@GLIBC_2.2.5
63: 0000000000600ae8 0 NOTYPE GLOBAL DEFAULT ABS _end
64: 0000000000000000 0 FUNC GLOBAL DEFAULT UND rand@@GLIBC_2.2.5
65: 0000000000600ad4 0 NOTYPE GLOBAL DEFAULT ABS _edata
66: 0000000000000000 0 FUNC GLOBAL DEFAULT UND time@@GLIBC_2.2.5
67: 0000000000400624 207 FUNC GLOBAL DEFAULT 13 main
68: 00000000004004a8 0 FUNC GLOBAL DEFAULT 11 _init
readelf
แสดงข้อมูลเกี่ยวกับไฟล์ออบเจ็กต์รูปแบบ ELF หนึ่งรายการขึ้นไป ตัวเลือกควบคุมข้อมูลเฉพาะที่จะแสดง
elffile ... เป็นไฟล์วัตถุที่จะตรวจสอบ รองรับไฟล์ ELF แบบ 32 บิตและ 64 บิตเช่นเดียวกับไฟล์เก็บถาวรที่มีไฟล์ ELF
nm exe_file
แสดงรายการสัญลักษณ์จากตารางวัตถุ:
$ nm exe_file
0000000000600ad4 A __bss_start
000000000040056c t call_gmon_start
0000000000600ad8 b completed.6349
00000000006008c8 d __CTOR_END__
00000000006008c0 d __CTOR_LIST__
0000000000600ad0 D __data_start
0000000000600ad0 W data_start
00000000004007a0 t __do_global_ctors_aux
0000000000400590 t __do_global_dtors_aux
00000000004007f0 R __dso_handle
00000000006008d8 D __DTOR_END__
0000000000600ae0 b dtor_idx.6351
00000000006008d0 d __DTOR_LIST__
00000000006008e8 d _DYNAMIC
0000000000600ad4 A _edata
0000000000600ae8 A _end
00000000004007d8 T _fini
0000000000400600 t frame_dummy
00000000004008b8 r __FRAME_END__
0000000000600a80 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
00000000004004a8 T _init
00000000006008bc d __init_array_end
00000000006008bc d __init_array_start
00000000004007e8 R _IO_stdin_used
00000000006008e0 d __JCR_END__
00000000006008e0 d __JCR_LIST__
w _Jv_RegisterClasses
0000000000400700 T __libc_csu_fini
0000000000400710 T __libc_csu_init
U __libc_start_main@@GLIBC_2.2.5
0000000000400624 T main
U mkstemp@@GLIBC_2.2.5
U rand@@GLIBC_2.2.5
U sprintf@@GLIBC_2.2.5
U srand@@GLIBC_2.2.5
0000000000400540 T _start
U system@@GLIBC_2.2.5
U time@@GLIBC_2.2.5
nm
แสดงรายการสัญลักษณ์จากอ็อบเจ็กต์ไฟล์ objfile .... หากไม่มีรายการอ็อบเจ็กต์ไฟล์ที่เป็นอาร์กิวเมนต์ nm จะถือว่าไฟล์ a.out
นอกจากการแยกส่วนไบนารีด้วยobjdump
แล้วยังสามารถใช้เครื่องถอดรหัส
สำหรับการคอมไพล์เมื่อเร็ว ๆ นี้ฉันได้ท้าทายทางเทคนิคที่ฉันจำเป็นต้องคอมไพล์ไบนารีลินุกซ์ 64 บิตขนาดเล็กสองตัว
ฉันพยายามใช้บูมเมอแรงและสโนว์แมน ดูเหมือนว่าโครงการบูมเมอแรงจะถูกทิ้งร้างและฉันก็ไม่ประทับใจกับข้อ จำกัด ของทั้งคู่ ทางเลือกอื่น ๆ อีกมากมายไม่ว่าจะเป็นโอเพนซอร์ซ / ฟรีแวร์ / เก่ารวมถึงตัวเลือกล่าสุดที่ออกโดย Avast เพียง 32 บิตเท่านั้น
ฉันลองทดลองใช้Hopperใน MacOS (ยังมีรุ่น Linux)
Hopper Disassembler เครื่องมือวิศวกรรมย้อนกลับที่ช่วยให้คุณถอดแยกส่วนประกอบถอดรหัสและดีบักแอปพลิเคชันของคุณ
กระโดดแยกส่วนและแยกส่วนไบนารี 32 หรือ 64 บิตสำหรับ OS / X, Linux และ Windows มันสามารถจัดการกับไบนารีขนาดใหญ่ได้เมื่อได้รับอนุญาต
นอกจากนี้ยังสร้างโฟลว์กราฟของฟังก์ชัน / โครงสร้างโปรแกรมและตัวแปร
นอกจากนี้ยังได้รับการดูแลและปรับปรุงอย่างแข็งขัน อย่างไรก็ตามมันเป็นเชิงพาณิชย์
ฉันสนุกมากกับการใช้มันและผลลัพธ์ที่ได้ซึ่งซื้อใบอนุญาต ใบอนุญาตมีราคาไม่แพงมากไปกว่ารังสีหกเหลี่ยมด้วยการยิงระยะไกล
ในความคิดเห็นของคำตอบนี้ @ d33tah และ @Josh ยังพูดถึงว่าเป็นทางเลือกโอเพนซอร์สradare2บวกกับส่วนต่อประสานกราฟิกที่เกี่ยวข้องคัตเตอร์คล้ายกับ Hopper ใน Linux ไม่สามารถรับรองเป็นการส่วนตัวได้เพราะฉันไม่ได้ใช้
นอกจากนี้เมื่อไบนารีเป้าหมายถูกรวบรวมด้วยข้อมูลการดีบักคุณอาจได้ชื่อของฟังก์ชันและตัวแปรกลับมา
ยิ่งไปกว่านั้นคุณจะไม่ได้รับความคิดเห็นกลับมาในซอร์สโค้ดเนื่องจากมันไม่ได้ถูกคอมไพล์ด้วยวิธีการใด ๆ
การปรับปรุงคุณภาพของแหล่งสัญญาณขาออกและความเข้าใจของเลขฐานสองจะหมายถึงเวลาและงานนักสืบเสมอ เครื่อง Decompilers ทำหน้าที่ได้มาก
ตัวอย่างของเอาต์พุต Hopper ที่ไม่มีข้อมูลการดีบัก:
int EntryPoint(int arg0, int arg1, int arg2) {
rdx = arg2;
rbx = arg1;
r12 = arg0;
if (r12 <= 0x1) goto loc_100000bdf;
loc_10000093c:
r15 = *(rbx + 0x8);
if (strcmp(r15, "-l") == 0x0) goto loc_1000009c2;
loc_100000953:
if (strcmp(r15, "-s") == 0x0) goto loc_100000a45;
ส่วนต่อประสานกราฟิกแบบ Hopper นั้นสามารถใช้งานได้เป็นอย่างดี (ฟังก์ชั่นหลายอย่างในเวลาเดียวกันในภาพนี้):
ฉันยังตอบเกี่ยวกับสิ่งที่กระโดดที่นี่ดังนั้น - Decompiler C ที่ดีคืออะไร?
ดูคำถามที่เกี่ยวข้องด้วยเหตุใดจึงมีความจริงและเท็จขนาดใหญ่