ทำความเข้าใจกับสิ่งที่ไบนารีของ Linux กำลังทำอยู่


52

ฉันเพิ่งมีงานที่ทำงานเพื่อทำความเข้าใจกับโปรแกรมไบนารีลินุกซ์ อย่างไรก็ตามโปรแกรมอยู่ในรูปแบบไบนารี

ผมใช้คำสั่งfile, stringsและobjdumpที่จะมีความคิดเล็กน้อยของสิ่งที่มันกำลังทำอะไรและสิ่งที่ฟังก์ชั่นที่มันจะถูกเรียก

ดูเหมือนว่าไบนารีจะถูกคอมไพล์ด้วยข้อมูลการดีบัก ฉันสามารถเรียนรู้อะไรได้อีก


3
คุณมีความคิดว่าไบนารีนั้นกำลังทำอะไรอยู่? คุณสงสัยว่ามันเป็นมัลแวร์ บางตัวที่ออกแบบมาเพื่อทำอันตรายต่อระบบของคุณหรือไม่? ถ้าใช่ว่าควรจะไปเป็นคำถาม (ตั้งแต่แล้วคุณต้องระมัดระวังเป็นพิเศษที่จะ จำกัด อันตรายที่เป็นไปได้)
Basile Starynkevitch

มันเป็นความท้าทายทางนิติวิทยาศาสตร์

1
ldd และ strace เป็นเพื่อนของคุณ
user2497

คำตอบ:


83

รวมถึงคำสั่งที่คุณใช้ไปแล้วฉันจะพยายามอย่างดีที่สุดเพื่อให้รายละเอียดสิ่งที่สามารถทำได้เพื่อดำเนินการทางนิติวิทยาศาสตร์ในไฟล์ปฏิบัติการ

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 ที่ดีคืออะไร?

ดูคำถามที่เกี่ยวข้องด้วยเหตุใดจึงมีความจริงและเท็จขนาดใหญ่


1
อย่าลืมstrace -fติดตามหัวข้อ / กระบวนการ มีตัวเลือกที่จะแยกการส่งออกเป็นไฟล์แยกต่างหากสำหรับแต่ละ PID มีหรือคุณสามารถเพียงแค่/12345 ในlessการค้นหาและเน้นเส้นที่เริ่มต้นด้วย PID คุณสนใจ. หากสิ่งที่ยังไม่ได้รายละเอียดด้านล่างกันเกินไป (เช่นเชลล์สคริปต์เริ่มต้นอื่น ๆ กระบวนการไม่ใช่เธรดที่เกิดขึ้นพร้อมกัน) ซึ่งสามารถใช้งานได้ แต่ใช่มันมีประโยชน์อย่างยิ่งในการดูว่าไฟล์ config / ไฟล์อื่น ๆ ของซอฟต์แวร์ที่ทำให้เกิดความสับสนกำลังพยายามอ่านเมื่อพยายามคิดว่าทำไมมันถึงไม่พอใจกับวิธีการติดตั้งของคุณ
Peter Cordes

4
คำตอบที่ดี! ฉันจะเพิ่มradare2ไปยังรายการ
d33tah

2
Cutter เป็นตัวห่อ GUI รอบ ๆ radare2 ดูเหมือนว่ามันอาจจะคล้ายกับ Hopper (แต่ฟรี)
Josh

2
wrt ldd: โปรดทราบว่าในบางสถานการณ์ (เช่นที่โปรแกรมระบุล่าม ELF นอกเหนือจาก ld-linux.so) ldd บางรุ่นอาจพยายามรับข้อมูลการพึ่งพาโดยพยายามเรียกใช้โปรแกรมโดยตรง (ซึ่งอาจทำให้เกิด เพื่อการประมวลผลของรหัสใด ๆ ที่กำหนดไว้ในล่าม ELF ของโปรแกรมและอาจเป็นการประมวลผลของโปรแกรมเอง) ดังนั้นคุณไม่ควรใช้ ldd ในการปฏิบัติการที่ไม่น่าเชื่อถือเนื่องจากอาจส่งผลให้มีการใช้รหัสโดยอำเภอใจ ทางเลือกที่ปลอดภัยกว่าเมื่อจัดการกับไฟล์ที่ไม่น่าเชื่อถือคือ:
Pryftan

2
$ objdump -p / path / to / program | grep ต้องการ
Pryftan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.