Phantom

[FC3] Gate – Iron_golem 본문

Pwnable/[Wargame]FC3

[FC3] Gate – Iron_golem

Ph4nt0m_ 2017. 4. 21. 11:31
반응형


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 만들어 호출을 어렵게 만들었습니다.

그리고 마지막 NX(Not Executable) – 기본적으로 스택에 있는 내용을 실행 없습니다.


Stack 영역에 read write 권한 밖에 없는 것을 아실 있습니다.

그리고 대부분의 영역에서 x 실행권한이 없는 것을 있습니다.


이게 문제인 iron_golem인데 LOB 처음 시작할 때처럼 아주 간단한 소스코드이다.

하지만 FC3이기에 조금 어려울 뿐이다.


아직은 많이 아는 것이 없기 때문에 WriteUp 보고 풀지만 이해는 하고 넘어갈 것이다.

.. 프로그램으로 여러 응용을 했으면 좋겠다는 아직의 바람이다.


힌트에 Fake EBP 사용하라 하는데 처음 이것을 봤을땐 LOB Fake EBP 생각 했다

그대로 하려 했던 것이 문제였다.

단지 힌트는 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

264 – 256 = 8 byte 더미 코드 이다.
그러면 메모리는 이렇게 된다.


빨간색이 Buffer 노란색이 Dummy 초록색이 SFP 하늘색이 RET 남색이 argc, argv, env 이다.

..이것은기초이니이제본격적으로문제를풀어보자.
RTL 쓰려면 우선 라이브러리에 있는 함수 주소가 필요한데.. 라이브러리는 ASCII Armor 인데 최상위 1바이트가 \x00이다.


앞의 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 구한다.


GOT 0x8049618부터 시작한다.

0x804954c 안에는 다음이 들어있다.

GOT 이용하여 execl함수를 실행시키면 0x01 실행하게 된다

우리는 같은 폴더 안에 \x01이라는 이름으로 프로그램을 하나 만든다

쉘을 실행시키는 프로그램이다 컴파일을 하고 이름을 \x01 바꾼다.

이제 execl함수를 실행하기 위해 인자를 조정해야 하는데

execl함수의 원형은 다음과 같다.

앞에 경로, 그리고 arg 들어가는데 argv[0]부터 argv[n]까지 들어간다.

사용법은 이렇다.


우리는 그렇다면.. 어떻게 인자를 줘야 할까?

GOT안에서 인자를 줘야 하는데 그렇게 하는 방법은 아직 모르겠다.

SFP 0x8049618 넣으면 RET에서는 execl+3 주소를 줘야 한다

Execl+3이되는 이유는 execl 함수 프롤로그를 한다. 그러면 SFP execl함수의 EBP 저장 하겠지? 그러면 Fake EBP 사용 수가 없기에 execl+3, 함수프롤로그가 지난 다음의 주소를 주는 것이다.

그렇게 되면 0x8049618주소에 0x804954c안의 0x01 인자로 가지게 것이다.

그럼 다음 인자는 0x24 0xc?

원하는 인자를 없다 그러므로 execl 경로인자와 argv[0]인자를 NULL 줘야 하는데 다행히 0x8049618 - 8 정도 곳에는 아무런 값도 들어가 있지 않다.

그렇다면 우리는 이렇게 페이로드를 있다.

./iron_golem $(perl –e ‘print “\x90”x264, “\x10\x96\x04\x08”, “\x23\x57\x7a”’)


이렇게 해서 Iron_golem 클리어 했다.


의문점들은 차차 알아봐서 추가할 생각이다. GOT영역을 썼던것은 여기서는 그저 아스키 아머를 우회하기 위해서였다.


반응형

'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
Comments