이번 시간에는 오랜만에 리버싱에 대한 내용을 다루도록 하겠습니다.리버싱을 하기 위해 저는 지금까지 radare2를 사용했습니다.radare2도 물론 훌륭하겠지만, 다양한 강의 자료가 gdb를 기준으로 설명되어 있는 경우가 많기 때문에 리버싱을 공부하는 분이라면 꼭 알아야 할 것 같습니다.radare2나 다른 디버거를 다루신 분들은 이해하기 어려울 것 같습니다.먼저 기본 gdb 사용법을 살펴보고 pda를 입힌 gdb도 살펴보겠습니다.
우선 기본 gdb입니다.1. set disassembly-flavorintel 우리는 기본적으로 어셈블리 언어를 배우면 intel 문법을 주로 배웁니다. 따라서 gdb에서는 기본적으로 AT&T 문법으로 표시되지만 setdisas sembly-flavorintel을 하면 intel 형식의 문법으로 바꿉니다.다시 AT&T 문법으로 바꾸고 싶다면 setdisasembly-flavor AT&T를 하세요.
2. disasmain이 가장 많이 사용됩니다.main 함수를 보여달라는 건데 보편적으로 main 함수부터 보기 때문에 disas main이라고 명시해놨는데 다른 함수를 보려면 disas 함수명으로 해주세요.(radare2의 ‘pdf@ 함수명’이라고 생각하시면 됩니다.)
3. breakpoint 다음은 breakpoint 거는 방법입니다.gdb에서는 breakpoint를 걸 때 b 명령을 사용합니다.주로 main 함수에서 몇 번째로 떨어져 있는지를 보고 b*main+떨어져 있는 수 이런 식으로 많이 사용합니다.
4.run을 재실행합니다. 줄여서 r로도 사용됩니다.
5. inforeg$eax 레지스터 정보를 보는 데 사용됩니다.inforreg$ 보고 싶은 레지스터가 되면 해당 레지스터의 값이 출력됩니다.
6.x 명령은 주로 레지스터 값을 한 번에 볼 때 사용됩니다.자세한 사용법은 상황에 따라 다르니 다음에 따로 만들도록 하겠습니다.
이번에는 pda를 입힌 gdb와 gdb의 차이점을 설명하겠습니다.1.setdisassembly-flavorintel(X)setdisassembly-flavorintel은 필요없습니다.기본적으로 intel 문법으로 세팅되어 있습니다.
2. cleargdb에서 화면을 깨끗하게 하고 싶다면 Ctrl+L을 사용해야 합니다.물론 pda에서도 Ctrl+L이 작동하지만 clear를 사용할 수도 있습니다.
3. runbreakpoint를 걸고 run을 했을 때 gdb는 breakpoint에 걸렸다는 정보만 출력합니다.그러나 pda에서는 스택 값, 레지스터 값 등을 상세하게 출력해 줍니다.
이번에는 gdb와 pda의 사용법에 대해 배웠습니다.아주 기초적인 것만 말했지만 사용법을 익히기에는 충분합니다.그럼 gdb로 리버싱 힘내세요 😀