- Today
- Total
Phantom
[FC3] Gate – Iron_golem 본문
FC3에 입성 했다.
전의 LOB와는 달리 페도라 코어 3에는 다음 메모리 보호기법이 추가되었다.
[환경 요약]
Stack Dummy : O
Down privileage of bash : O
Random Stack : O
Random Library : X
Random Program Binary Mapped : X
ASCII Armor : O
Non-Executable Stack : O
Non-Executable Heap : O
Stack Carany : X
Stack Smashing Protector : X
요약하자면 ASLR은 스택에만 걸려 있고, ASCII Armor, NX가 스택과 힙에 걸려 있다.
ASLR이란 Address Space Layout Randomization – 프로그램의 메모리영역을 랜덤화 시키는 것이다.
ASCII Armor는 공유 라이브러리의 주소를 16M미만으로 만들어 연속적인 함수의 호출을 방지 했다고 합니다.
이것은 16M – 16777216 byte – 0x00ffffff – 16777215
즉 공유 라이브러리의 최상위 주소 1바이트를 \x00, NULL로 만들어 호출을 어렵게 만들었습니다.
Stack 영역에 read와 write 권한 밖에 없는 것을 아실 수 있습니다.
이게 첫 문제인 iron_golem인데 LOB를 처음 시작할 때처럼 아주 간단한 소스코드이다.
하지만 FC3이기에 조금 더 어려울 뿐이다.
아직은 많이 아는 것이 없기 때문에 WriteUp을 보고 풀지만 이해는 다 하고 넘어갈 것이다.
뭐.. 이 프로그램으로 여러 응용을 했으면 좋겠다는 아직의 바람이다.
힌트에 Fake EBP를 사용하라 하는데 처음 이것을 봤을땐 LOB의 Fake EBP를 생각 했다
그대로 하려 했던 것이 문제였다.
단지 힌트는 Fake EBP 일뿐이다.
Fake EBP를 간단히 설명하면 처음 프로그램을 실행하거나, 함수에 들어갈 때 스택 프레임을 형성한다. 그래서 함수 프롤로그, 에필로그가 있는 것이다.
이 과정의 반대인 에필로그의 leave를 볼 것이다
leave명령어는 이것의 반대로
mov esp, ebp
pop ebp 를 실행한다.
이과정의 pop ebp 를 통해 우리는 프로그램이나 함수의 원래 위치로 돌아올 수 있는 것이다.
이 에필로그 과정을 leave 명령어에서 한다고 하였다.
Pop ebp를 한 것은 main함수의 ebp인 SFP(Stack Frame Pointer)에 저장이 된다.
이것을 이용한 것을 Fake EBP라 한다.
EBP를 컨트롤하여 ret 위치를 바꾼다.
이번 문제에서는 그렇다면 RTL을 이용하여 문제를 풀겠다.
처음 0x108(264)만큼 크기를 할당한다.
그리고 eax에 버퍼의시작지점(ebp-0x108)의 주소를 복사하고 strcpy를 실행한다.
복사될 데이터의 크기는 검사하지 않는다. 그래서 취약점이 생긴다.
소스에서 우리의 버퍼는 256, 스택에 할당한 것은 264
앞의 1바이트가 \x00이라 표시되지 않는다.
Fake EBP를 이용해서 strcpy함수를 실행 시켜야 한다.
왜? Basic BOF는 스택에 NX가 걸려있으니 당연히 안되고 그럼 라이브러리 함수를 써야하는데 ASCII Armor가 걸려 있다.
음… 그렇다면 Ascii Armor를 우회하기 위해 GOT를 이용해서 execl함수를 실행 시켜 보자.
물론 다른 exec계열 함수도 가능할 것이다 각 함수마다 인자와 조건이 다를 뿐.
먼저 GOT를 알기 위해 PLT를 알아야 한다.
PLT는 “Procedure Linkage Table”의 약자로서 Procedure들을 연결해주는 테이블입니다. PLT 영역에 존재하는 Procedure 주소를 참조하면 해당함수의 GOT 영역에 접근을 해서 실제 함수의 주소 값을 호출하게 됩니다.
GOT는 “Global Offset Table”의 약자로서 실제 함수의 주소를 가지고 있는 테이블입니다. 이 테이블을 PLT가 참조해서 실제 함수까지 접근을 하게 됩니다. 하지만 처음부터 이 테이블이 실제 함수주소를 가지고 있지는 않습니다. 내부동작을 통해 이 테이블에 실제 함수주소가 삽입되는 동작을 수행합니다.
자세한 것은 이곳을 참조하기 바란다
GOT를 이용하여 execl함수를 실행시키면 0x01을 실행하게 된다
이제 execl함수를 실행하기 위해 인자를 조정해야 하는데
맨 앞에 경로, 그리고 arg가 들어가는데 argv[0]부터 argv[n]까지 들어간다.
우리는 그렇다면.. 어떻게 인자를 줘야 할까?
GOT안에서 인자를 줘야 하는데 그렇게 하는 방법은 아직 모르겠다.
SFP에 0x8049618를 넣으면 RET에서는 execl+3의 주소를 줘야 한다
그렇게 되면 0x8049618주소에 0x804954c안의 0x01을 첫 인자로 가지게 될 것이다.
그럼 다음 인자는 0x24와 0xc?
이렇게 해서 Iron_golem을 클리어 했다.
'Pwnable > [Wargame]FC3' 카테고리의 다른 글
Hell_fire – evil_wizard (0) | 2016.02.25 |
---|---|
Dark_eyes – Hell_fire (2) | 2016.02.23 |
[FC3] Iron_golem – Dark_eyes (0) | 2016.02.19 |