PTRACE_PEEKTEXT ptrace:输入/输出错误

问题描述 投票:0回答:1

我尝试使用 PTRACE_PEEKDATA 从内存中读取值。 要查找我正在使用 objdump 的特定行的内存地址 -

objdump --dwarf=decodedline ./exe_filename
并得到输出:

test:     file format elf64-x86-64



Contents of the .debug_line section:



test.c:

File name                            Line number    Starting address    View    Stmt

test.c                                        23              0x1369               x

test.c                                        23              0x1385               x

test.c                                        28              0x1394               x

test.c                                        29              0x139d               x

test.c                                        30              0x13c5               x

test.c                                        35              0x13cf               x

test.c                                        36              0x13da               x

test.c                                        37              0x13e3               x

test.c                                        38              0x13f2               x

test.c                                        42              0x13fc               x

test.c                                        44              0x1405               x

test.c                                        44              0x1423               x

test.c                                        45              0x1429               x

test.c                                        46              0x1438               x

test.c                                        50              0x1442               x

test.c                                        50              0x144d               x

test.c                                        50              0x1458               x

test.c                                        51              0x1466               x

test.c                                        52              0x1475               x

test.c                                        57              0x147f               x

test.c                                        57              0x149b               x

test.c                                        58              0x14a0               x

test.c                                        59              0x14af               x

test.c                                        63              0x14b9               x

test.c                                        64              0x14df               x

test.c                                        73              0x14fa               x

test.c                                        73              0x1505               x

test.c                                        73              0x1508               x

test.c                                        73              0x1513               x

test.c                                        74              0x1528               x

test.c                                        75              0x1548               x

test.c                                        76              0x1556               x

test.c                                        77              0x1581               x

test.c                                        78              0x15a3               x

test.c                                        79              0x15ae               x

test.c                                        79              0x15b2               x

test.c                                        79              0x15bc               x

test.c                                        79              0x15db               x

test.c                                        80              0x15e2               x

test.c                                        81              0x15ec               x

test.c                                        82              0x15fb               x

test.c                                        84              0x1605               x

test.c                                        84              0x1609               x

test.c                                        87              0x1635               x

test.c                                        87              0x163e               x

test.c                                        88              0x1647               x

test.c                                        88              0x164e               x

test.c                                        88              0x1652               x

test.c                                        88              0x165c               x

test.c                                        91              0x167c               x

test.c                                        91              0x169f               x

test.c                                        92              0x16a6               x

test.c                                        97              0x16cb               x

test.c                                        97              0x16ec               x

test.c                                        98              0x16f2               x

test.c                                        99              0x1701               x

test.c                                       103              0x170b               x

test.c                                       104              0x171a               x

test.c                                       104              0x1723               x

test.c                                       105              0x1728               x

test.c                                       105              0x1731               x

test.c                                       108              0x1754               x

test.c                                       112              0x1763               x

test.c                                       113              0x1789               x

test.c                                       120              0x17a4               x

test.c                                       121              0x17c9               x

test.c                                       122              0x17d5               x

test.c                                       125              0x17fb               x

test.c                                       127              0x181c               x

test.c                                       128              0x182b               x

test.c                                       128              0x1834               x

test.c                                       129              0x1838               x

test.c                                       132              0x1849               x

test.c                                       137              0x1858               x

现在,我使用:

unsigned long long int addr = 0x13cf;
unsigned long long int orig_data = ptrace(PTRACE_PEEKTEXT, child_pid, (void *)addr, 0);
if (orig_data == -1) {
     perror("ptrace2");
     exit(EXIT_FAILURE);
}

并得到错误:

ptrace2: Input/output error 

我想也许 objdump 返回偏移量,所以我搜索基地址以使用公式:

base address + offset = virtual address

我使用 Detect It Easy 发现基地址为 0。 所以,我不知道为什么它现在起作用了。

我还尝试在运行时从 gdb 调试器获取内存地址:

Breakpoint 1, main (argc=3, argv=0x7fffffffe038) at /home/vboxuser/Documents/CreateDebugger/test.c:35

35      child_pid = fork();

(gdb) disas main

Dump of assembler code for function main:

   0x0000555555555369 <+0>: endbr64 

   0x000055555555536d <+4>: push   %rbp

   0x000055555555536e <+5>: mov    %rsp,%rbp

   0x0000555555555371 <+8>: sub    $0x130,%rsp

   0x0000555555555378 <+15>:    mov    %edi,-0x124(%rbp)

   0x000055555555537e <+21>:    mov    %rsi,-0x130(%rbp)

   0x0000555555555385 <+28>:    mov    %fs:0x28,%rax

   0x000055555555538e <+37>:    mov    %rax,-0x8(%rbp)

   0x0000555555555392 <+41>:    xor    %eax,%eax

   0x0000555555555394 <+43>:    cmpl   $0x3,-0x124(%rbp)

   0x000055555555539b <+50>:    je     0x5555555553cf <main+102>

   0x000055555555539d <+52>:    mov    -0x130(%rbp),%rax

   0x00005555555553a4 <+59>:    mov    (%rax),%rdx

   0x00005555555553a7 <+62>:    mov    0x2c72(%rip),%rax        # 0x555555558020 <stderr@GLIBC_2.2.5>

   0x00005555555553ae <+69>:    lea    0xc53(%rip),%rcx        # 0x555555556008

   0x00005555555553b5 <+76>:    mov    %rcx,%rsi

   0x00005555555553b8 <+79>:    mov    %rax,%rdi

   0x00005555555553bb <+82>:    mov    $0x0,%eax

   0x00005555555553c0 <+87>:    call   0x5555555551d0 <fprintf@plt>

   0x00005555555553c5 <+92>:    mov    $0x1,%eax

   0x00005555555553ca <+97>:    jmp    0x55555555583e <main+1237>

=> 0x00005555555553cf <+102>:   call   0x555555555270 <fork@plt>

   0x00005555555553d4 <+107>:   mov    %eax,-0x11c(%rbp)

   0x00005555555553da <+113>:   cmpl   $0xffffffff,-0x11c(%rbp)

   0x00005555555553e1 <+120>:   jne    0x5555555553fc <main+147>

   0x00005555555553e3 <+122>:   lea    0xc45(%rip),%rax        # 0x55555555602f

   0x00005555555553ea <+129>:   mov    %rax,%rdi

   0x00005555555553ed <+132>:   call   0x555555555230 <perror@plt>

   0x00005555555553f2 <+137>:   mov    $0x1,%eax

   0x00005555555553f7 <+142>:   jmp    0x55555555583e <main+1237>

   0x00005555555553fc <+147>:   cmpl   $0x0,-0x11c(%rbp)

   0x0000555555555403 <+154>:   jne    0x55555555547f <main+278>

   0x0000555555555405 <+156>:   mov    $0x0,%ecx

--Type <RET> for more, q to quit, c to continue without paging--

地址 0x00005555555553cf 和 0x7fffffffe038 也不起作用。

在PTRACE_PEEKTEXT中,我需要放入源代码中的行虚拟地址?怎么找到他? ASLR 会影响地址内存还是固定的? 或者也许问题出在

child_pid

请帮忙,我在这个问题上花了很多时间。 感谢您的帮助!

顺便说一句,我在虚拟机 Ubuntu 22.04 中使用。

c debugging virtual-memory ptrace
1个回答
0
投票

哦,我也遇到这个问题,如果你已经解决了这个问题,请告诉我为什么。

© www.soinside.com 2019 - 2024. All rights reserved.