이제 gdb 사용법도 알았고 그러면 이제 문제를 풀어봅시다
사실 숙제로 내줬음 ㅋㅋㅋㅋ
그럼 해당 파일을 gdb를 이용해서 풀어봅시다
자 근데 여기서 일반 gdb랑 조금 다른거 같죠?
그렇습니다 gdb-peda라고 하는데 설치방법은 이러합니다
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
위와 같이 설치를 해주시고 gdb를 실행시키면 gdb-peda로 실행이 됩니다
그럼 차이점이 무엇인가요??
PEDA는 Linux환경에서 동작하며 binary분석 및 Exploit을 도와주는 도구라고 보시면 됩니다.
-> peda 설명 https://go-madhat.github.io/gdb-peda/
그럼 문제의 homework.c를 보도록 합시다.
(이제 disass main은 당연히 자동으로 나와야겠죠?)
하나하나 살펴보아야 하지만 대충 확인을 해보면 +49에서 scanf함수를 이용하고 있습니다.
그러면 입력값이 들어가는것이 있다고 유추해볼 수 있습니다.
한줄씩 살펴볼까요? -> breakpoint를 걸어줍니다.
?????
우리가 봤었던 gdb화면과는 살짝 다르죠??
이게 바로 gdb-peda 입니다. 기존의 gdb는 레지스터 및 스택을 따로 봐야 했었지만
peda에서는 한번에 확인이 가능하죠 -> 정말 편리한 기능입니다.
코드를 살펴보면 main함수를 확인하기 전에 위에 func함수를 볼 수 있는데
별도의 함수가 있는거 같습니다. 자 그러면 레지스터 정보를 확인 해볼까요??
프로그램을 실행했을때 아직은 큰 변화가 보이지는 않는것 같습니다.
그도 그럴게 맨처음 코드를 보면 스택프롤로그 즉 스택이 시작되는 부분이기 때문이죠
메인 함수 +8에 0x28의 값을 rax에 mov하고 있는데 해당 함수로 이동한 다음
값을 확인해 보도록 합시다.
rax값이 변경이 된것을 볼 수 있습니다. 하지만 이상태로는 식별이 힘드니
아래로 계속 실행하면서 분석을 하도록 하겠습니다.
xor eax eax를 통해서 rax 값을 0으로 초기화를 시켜주는것을 볼 수 있습니다.
eax에서 확장된 부분이 rax이니까 당연히 레지스터에서는 rax가 0이 되겠죠??
계속 실행을 시켜보겠습니다.
추측을 해보면 아까 peda 이전의 gdb에서 scanf함수를 확인을 했기때문에 입력을 하고 나면
rax값이 입력값으로 바뀔것이라고 생각할 수 있습니다.
다시 한줄을 실행시키니 rax값이 변경되었습니다.
+30에 코드 때문이겠죠? 그러면 지금 rax값은 rbp-0xc의 값이 lea되었다라고 보면 됩니다.
그리고 다시 rax값을 rsi로 mov를 해주고 있습니다. (rbp-0xc의 값이 rsi로 들어가고 있습니다.)
여기서 코드를 보면 다시 +44부분에서 다시 eax에 0을 넣어주고 scanf함수를 호출하네요
scanf함수를 실행을 하고나서 조금더 실행을 시켜보면
func 함수를 실행하고 있는것을 볼 수 있습니다.
코드를 한줄 더 실행해보면 scanf 함수를 호출해서 입력을 받는것을 확인 할 수가 있습니다.
그래서 3을 입력을 해주면?? rax에 3이 들어가지 않을까요?
여기서 코드를 살펴보면 rbp-0xc의 값을 eax로 mov를 해주고 있네요
그러면 이 함수를 실행하면 rax에 3이라는 값이 저장이 될것 같아 보입니다.
왜냐하면 3을 입력을 했고 그럼 3이라는 값이 rax로 들어가야하는데
코드를 보면 해당 주소의 값이 eax로 들어가서 입니다.
자 그럼 확인을 해볼까요?
역시나 rax에 우리가 입력한 3이라는 값이 들어가 있습니다.
그리고 다음 코드는 func라는 함수를 호출하고 있네요
한번 실행을 시켜보도록 하겠습니다.
실행결과가 나오고 있네요 그러면 func라는 함수는 실행결과로 보아
계속해서 덧셈을 반복해주고 있는거 같아 보입니다. (func라는 함수도 한번 봐야할것 같습니다.)
일단 main함수를 계속해서 보겠습니다.
+64부분에서 보면 eax값에 0을 넣어줌으로 이전에 실행했던 func함수를 실행하고
다시 원래대로 돌아가는 것을 볼 수 있는데요 아마도 함수를 실행하고
다시 원래의 상태로 돌려준 후 종료가 되는것 같습니다. -> 스택 에필로그 같아 보입니다.
생각대로 je 구문을 통해서 +89가 있는곳으로 점프(이동) 하게 되는데, 그곳에는 leave 명령어가 있습니다.
leave는 현재까지 썻던 메모리 스택을 깔끔히 비우고, 자신을 호출했던
메모리의 베이스 주소를 ebp에 다시 채우는 명령어 입니다.
-> 즉, 이제 까지 사용했던 자원들을 반납을 하게 되는것이죠
정상적으로 종료되는 단계라고 볼 수 있습니다.
당연히 그다음 구문은 ret가 있어서 종료가 되는것을 확인 할 수 있습니다. (스택 에필로그)
여기까지 main 함수를 한번 gdb-peda를 사용해서 분석해보았습니다.
다음에는 func 함수를 한번 보도록 하겠습니다.
확실히 gdb-peda가 사용하는 측면에 있어서 편하긴 하네요
그럼 20000~
'Theory > Pwnable' 카테고리의 다른 글
찬희의 Pwn 포너블 기초 3주차 1차시 homework2.c (0) | 2021.09.09 |
---|---|
찬희의 Pwn 포너블 기초 3주차 2차시 homework.c (0) | 2021.09.09 |
찬희의 Pwn 포너블 기초 2주차 2차시 GDB를 사용해보자 2 (0) | 2021.08.28 |
찬희의 Pwn 포너블 기초 2주차 1차시 GDB를 사용해보자 1 (0) | 2021.08.28 |
찬희의 Pwn 포너블 기초 1주차 3차시 (0) | 2021.08.22 |