passcode : hackers proof
(NO DRAG, NO PASSCODE)
bash2 조심. orc 프로그램과 소스코드가 있다. 분석하자.
중간에는 크게 의미없는 코드인줄 알았지만 환경변수를 모두 0으로 만들어서 환경변수를 쓰지 못하게 만들고 있다. 즉 전에 썼던 export를 사용하지 못한다. 또 egghunter 라는 것을 보니 환경변수는 못 쓸 것 같다.
우리는 argv[1][47]을 ‘\bf’로 만들어주어야 한다.
이제 gdb를 통하여 메모리 구조를 살펴보자.
메모리 구조는 다음과 같다.
—————————— High Address
| ret(4) |
——————————
| sfp(4) |
—————————— ← ebp
| buffer(40) |
——————————
| int(4) |
—————————— Low Address
따라서 44bytes(buffer + sfp) 만큼 NOP + shellcode로 덮고 그 뒤에 ret 주소를 buffer의 시작 주소로 하면 될 것 같다.
buffer 주소를 구하는 기존 방법은 gdb로 프로그램을 돌려서 값이 어느 주소에 저장되는지 확인하는 방법이었다. 하지만 gdb로 돌리게 되면 주소가 계속 바뀌어 한번에 쉘을 따기 어렵다. 효율성을 위하여 더 좋은 방법을 찾자.
우선 orc.c 코드를 tmp에 옯겨서 새로운 프로그램의 이름으로 컴파일해보자. 여기서 주소를 확인하기 위하여 코드의 마지막 줄의 서식문자를 %s -> %p 로 바꾸자.
printf(“%p\n”, buffer);
일단 buffer의 주소로 예상되는 값이 나왔다. -> 0xbffffaa0
이를 이용하여 payload를 짜고 쉘을 따보자.
segmentation fault 이지만 뒤에 core dump 라고 되어 있다.
확인해보니 core 라는 파일이 있다. 여기를 분석하면 정확한 buffer의 주소를 알 수 있다고 한다.
NOP(\x90)이 들어간 부분을 살펴보면 된다. -> 0xbfffbfe
이제 이 주소로 다시 쉘을 따보자.
[orc] : cantata
'Pwnable > LOB' 카테고리의 다른 글
[LOB] 5. WOLFMAN (0) | 2020.08.28 |
---|---|
[LOB] 4. ORC (0) | 2020.08.28 |
[LOB] 2. COBOLT (0) | 2020.08.28 |
[LOB] 1. GREMLIN (0) | 2020.08.28 |
[LOB] 0. GATE (0) | 2020.08.28 |