문제를 처음 본 순간 미루고 미루던 gdb 공부를 해야겠구나 라는 생각이 들었다.
그렇게 문제를 처음 본지 하루 정도가 지나서야 간단한 gdb명령어를 익히고 bof 문제를 제대로 풀기 시작했다.
여기서 사용된 개념인 gdb, 버퍼오버플로우, python을 통한 인자 전달은 다른 포스팅에서 설명하겠습니다.
사전조사
해당 문제는 소스파일과 문제파일 두개를 주었고, 문제의 정답은 nc pwnable.kr 9000을 통해서 입력해 주면 될듯 합니다.
bof.c소스파일
해당 문제의 소스 파일을 먼저 간단하게 해석해보면 key값이 0xcafebabe와 같아지면 쉘을 실행시켜주고 그 실행된 쉘을 통해서 flag파일을 찾으면 될 듯 합니다.
하지만 key의 값을 입력하는 곳은 어디에도 없고 func에서 overflowme에만 값을 입력할 수 있습니다.
앞서 말했듯이 버퍼오버플로우 문제임을 확신할 수 있습니다.
먼저 버퍼오버플로우를 발생시키기 위해서 overflowme와 key값이 스택의 어느부분에 있으며 어느정도의 값을 입력해야 오버플로우가 발생하는지 gdb를 통해서 확인 합니다.
main함수
func함수
key는 0x56555693 [main + 9] 를 참고 하면 되며,
overflowme는 0x5655564f [func + 35] 를 참고하여 각각 스택에 저장되는 위치를 확인해 주면 된다.
그럼 [func+35] 에서 overflowme의 값을 입력해 주는 함수이므로
[func + 35]에서 'aaaaaaaa'를 입력한 후에 메모리의 값을 확인해 보겠습니다.
func의 현재 진행 상황
esp의 메모리 값
a = > \x61
현재 overflowme는 0xffffd31c에서부터 적제가 되며
key의 값이 deadbeef이므로 그 값을 찾아보면
현재 0xffffd350에 적제되어 있는것을 확인할 수 있습니다.
결과 도출
0xffffd350 - 0xffffd31c = 0x34 = 52
즉, 52바이트를 입력한 후에 0xcafebabe를 입력하면 문제가 풀리게 된다.
여기서 이번에 공부한 개념을 하나하나 다 적기에는 무리가 있어 보여서 다른 포스팅에서 개념을 정리할 예정이며
앞으로도 이런식으로 진행되지 않을까 싶습니다.