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를 사용하고 있습니다.