pwndbg> b add
Breakpoint 1 at 0x40113e
pwndbg> r
[중략]
pwndbg> bt
#0 0x000000000040113e in add ()
#1 0x0000000000401177 in main ()
#2 0x00007ffff7dce1ca in __libc_start_call_main (main=main@entry=0x40114e <main>, argc=argc@entry=1, argv=argv@entry=0x7fffffffc938) at ../sysdeps/nptl/libc_start_call_main.h:58
#3 0x00007ffff7dce28b in __libc_start_main_impl (main=0x40114e <main>, argc=1, argv=0x7fffffffc938, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,
stack_end=0x7fffffffc928) at ../csu/libc-start.c:360
#4 0x0000000000401075 in _start ()
pwndbg>
7) dump memory
프로세스 메모리 상태를 파일로 저장하는 명령어
dump memory <파일명> <시작주소> <끝주소>
8) context
pwndbg는 주요 메모리들의 상태를 프로그램이 실행되고 있는 context라고 부름
기본적으로 프로그램이 중단되면 ctx를 출력하지만 별도로 ctx 명령어로 실행할 수도 있음
4개의 영역 -> reg, disasm(rip부터 여러 줄에 걸쳐 디스어셈블된 결과), stack(rsp부터 스택의 값), backtrace(현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출됐는지 보여줌)
9) set
프로세스 메모리 상태를 변경할 수 있는 명령어
주로 레지나 특정 주소의 메모리 값을 변경함
실행 중에서 가능
set <주소/레지스터> = <변경할 값>
pwndbg> set $rax = 0
pwndbg> set $rsp = $rbp
자료형 변경
pwndbg> set *(unsigned int*)0x400000 = 10
# 0x400000 주소를 unsigned int * 형으로 역참조 후 여기에 정수 10을 저장한 것
pwndbg> set *(float*)0x400010 = 3.14
# 0x400010 주소를 float* 형으로 역참조 후 여기에 부동소수점 값 3.14 저장
* c언어, 파이썬은 컴파일러에서 스택 프레임을 자동으로 설정해준다. ***어셈블리어는?*** -> '함수 프롤로그'와 '함수 에필로그' 두 방법으로 관리
1. 함수 프롤로그 (Function Prologue)
push ebp
mov ebp, esp
sub esp, 0x100
- push ebp: 현재 페이스 포인터를 스택에 푸쉬하여 나중에 에필로그 과정에서 복구할 수 있도록 함 - mov ebp, esp: 베이스 포인터를 현재 스택 포인터의 주소로 설정함 - sub esp. 0x100: 스택 프레임 공간 확보
2. 함수 에필로그 (Function Epilogue)
mov esp, ebp
pop ebp
ret
- mov esp, ebp: esp를 ebp의 주소로 바꿈 - pop ebp: 푸쉬했던 베이스 포인터의 값을 다시 pop 연산으로 ebp에 넣은 후 스택에서 제거 - ret: 함수 호출 전 주소로 돌아감
leave
ret
mov esp, ebp; pop ebp -> leave로 가능 x86 내장 명령어
5) 힙 세그먼트 (Heap Segment)
힙 데이터가 위치하는 세그먼트로 스택과 마찬가지로 동적 할당 가능
리눅스에서는 스택과 반대방향으로 자란다. 즉, 주소가 커지는 쪽으로 자람
c언어에서는 malloc(), calloc() 등의 함수로 호출해서 할당받는 메모리가 이 세그먼트에 위치
-> read, write 가능
어셈블리어에서는 sys_brk(), mmap()와 같은 시스템 로 힙 세그먼트 관리할 수 있음
ex)
int main() {
int *heap_data_ptr =
malloc(sizeof(*heap_data_ptr)); // 동적 할당한 힙 영역의 주소를 가리킴
*heap_data_ptr = 31337; // 힙 영역에 값을 씀
printf("%d\n", *heap_data_ptr); // 힙 영역의 값을 사용함
return 0;
}