source

GDB를 사용하여 메모리 내용을 수정하는 방법

manycodes 2023. 1. 15. 17:17
반응형

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

반응형