GDB를 사용하여 메모리 내용을 수정하는 방법
메모리 액세스 및 읽기에는 print, p, x 등 여러 명령을 사용할 수 있습니다.
단, (GDB에서의 디버깅 중) 특정 장소에서 메모리의 내용을 변경하려면 어떻게 해야 합니까?
가장 쉬운 것은 프로그램 변수 설정입니다(GDB: 할당 참조).
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
또는 주소별로 임의의(쓰기 가능한) 위치를 업데이트할 수도 있습니다.
(gdb) set {int}0x83040 = 4
더 있습니다.매뉴얼을 읽어주세요.
Nikolai가 말했듯이 gdb 'set' 명령을 사용하여 변수 값을 변경할 수 있습니다.
set 명령어를 사용하여 메모리 위치를 변경할 수도 있습니다.예: Nikolai의 예를 확장합니다.
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
(gdb) p &i
$2 = (int *) 0xbfbb0000
(gdb) set *((int *) 0xbfbb0000) = 20
(gdb) p i
$3 = 20
이 기능은 모든 유효한 포인터에 대해 작동해야 하며 적절한 데이터 유형에 캐스팅할 수 있습니다.
여기에 제시된 답변에 대해 자세히 설명합니다.
그냥 하면 돼set idx = 1
변수를 설정할 수 있지만 변수 이름이 set 하위 명령과 충돌할 수 있으므로 이 구문은 권장하지 않습니다.예로서set w=1
유효하지 않습니다.
즉, 다음 구문을 사용하는 것이 좋습니다.set variable idx = 1
또는set var idx = 1
.
마지막으로 신뢰할 수 있는 오래된 print 명령어를 사용하면 식을 평가할 수 있습니다.유일한 차이점은 그가 그 표현의 결과도 출력한다는 것이다.
(gdb) p idx = 1
$1 = 1
gdb에 대한 자세한 내용은 여기를 참조하십시오.
가장 유용한 것 중 하나는 레지스터의 값을 직접 변경하는 것입니다.
0x000000000800088e <+67>: lea rdi,[rip+0x118] # 0x80009ad
rdi 레지스터 값을 변경하려면:
set $rdi = 0x8201010
언급URL : https://stackoverflow.com/questions/3305164/how-to-modify-memory-contents-using-gdb
'source' 카테고리의 다른 글
MySQL - 그룹화 기준 이외의 컬럼 선택 (0) | 2023.01.15 |
---|---|
리소스 컨트롤러의 Larabel 명명된 경로 (0) | 2023.01.15 |
재귀 SQL 쿼리의 무한 루프 (0) | 2023.01.15 |
두 날짜 사이의 시간을 찾을 수 없습니다 MySQL (0) | 2023.01.15 |
Python Django에서 유닛 테스트를 실행하는 동안 로깅을 비활성화하려면 어떻게 해야 합니까? (0) | 2023.01.15 |