passcode : gate
(NO DRAG, NO PASSCODE)
LOB의 첫번째 문제이다. (LOB는 옛날 버전이라 “\xff” 정상적인 16진수로 인식하지 못한다고 한다. 따라서 항상 문제 시작할 때 쉘에 ‘bash2’ 를 입력하여 쉘을 바꾸어 주어야 한다.)
gremlin 이라는 프로그램과 그의 소스코드가 들어있다. 소스코드를 분석해보자.
간단한 버퍼오버플로우 문제인 것 같다. 또한 gremlin 프로그램에 SetUID가 설정되어 있는지 확인해보자.
gremlin 프로그램에 SetUID가 설정되어 있다. 따라서 우리는 프로그램을 실행시키는 동안 root권한 혹은 다음 레벨의 권한을 얻을 것이다.
이제 gremlin 프로그램의 메모리 구조를 살펴보기 위하여 gdb로 분석하여 보자.
메모리 구조는 다음과 같다.
—————————— High Address
| ret(4) |
——————————
| sfp(4) |
—————————— ← ebp
| buffer(256) |
—————————— Low Address
따라서 우리는 buffer(256) + sfp(4) 를 NOP로 덮고 ret 주소를 buffer의 시작주소로 바꾸면 될 것 같다. original gremlin은 gdb로 프로그램 run이 막혀있어서 tmp에 gremlin을 옮겨야 할 것 같다. tmp 디렉토리가 없으므로 새로 생성하고 gremlin 파일을 복사하여 gdb 분석을 더 진행해보자.
우선 gdb를 실행한 후에 strcpy를 호출하는 부분 바로 뒤인 main+59에 bp를 걸어주고 AAAA라는 인자를 주어 실행하자. 또 AAAA 라는 값이 어떤 주소에 저장되는지 확인하자.
0xbffff9d8 부터 A가 저장되는 것을 볼 수 있다. 이를 바탕으로 payload를 짜서 쉘을 따보자.
계속 segmentation fault가 떠서 이 방법으로는 안될 것 같다.
그래서 ret 주소를 export한 shellcode의 주소로 바꾸자. 우선 shellcode를 export 해주고 shellcode의 주소를 얻어내는 프로그램을 작성하여 실행하자.
shellcode의 주소가 0xbfffede 인 것을 확인했다. 이제 이를 바탕으로 다시 payload를 짜서 쉘을 따보자.
성공적으로 쉘을 땄다. 권한도 다음 레벨인 gremlin으로 넘어간 것을 볼 수 있다. my-pass를 입력하여 다음 레벨로 넘어가자.
[gremlin] : hello bof world
'Pwnable > LOB' 카테고리의 다른 글
[LOB] 5. WOLFMAN (0) | 2020.08.28 |
---|---|
[LOB] 4. ORC (0) | 2020.08.28 |
[LOB] 3. GOBLIN (0) | 2020.08.28 |
[LOB] 2. COBOLT (0) | 2020.08.28 |
[LOB] 1. GREMLIN (0) | 2020.08.28 |