PTRACE_PEEKTEXT ptrace: 입력/출력 오류

PTRACE_PEEKTEXT ptrace: 입력/출력 오류

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

나는 사용했다쉬운 감지그리고 발견기본 주소는 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를 사용하고 있습니다.

관련 정보