Pwnable/LOB

[LOB] 3. GOBLIN

Lucvs 2020. 8. 28. 15:20

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