zombile_assassin의 소스를 먼저 확인하도록 하겠습니다.

strcpy대신 strncpy를 사용해서 값을 입력하네요. 다른 방법을 이용해야 할듯 합니다.


그런데 위에 보니 FEBP라는게 적혀있네요. FEBPFake EBP의 약자입니다.

이름에서 알 수 있듯이 EBP를 조작해서 푸는 문제입니다.


Fake EBP의 공격 기법에 대하여 간단히 설명하도록 하겠습니다.

Assassin문제를 풀때 retpop이 있는 곳으로 하는것이 핵심이었다면, 이문제는 retleave가 있는 곳으로 하는것이 핵심입니다.


스택을 보며 설명을 하도록 하겠습니다.

FEBP공격을 할때 스택을 다음과 같이 구성합니다.

ret(쉘코드’s address)

FEBP

ret(leave’s address)

SFP(FEBP’s address)

Buffer

FEBP의 동작순서는 다음과 같습니다.

1.    leave(mov esp, ebp; pop ebp)수행
mov esp, ebp
를 통해 esp, ebp모두 SFP를 가르키게 됩니다.
pop ebp
를 통해 SFP의 데이터가 ebp로 들어갑니다. 이로 인하여 ebpFEBP를 가르키게 됩니다.

2.    ret(pop eip)수행
pop eip
를 통하여 eipleave명령어를 가르키게 됩니다.

3.    다시 leave수행
mov esp, ebp
를 통해 esp, ebp모두 FEBP를 가르키게 됩니다.
pop ebp
를 통해 FEBP의 데이터가 ebp로 들어갑니다. 이로 인하여 espFEBP위의 ret를 가르키게 됩니다.

4.    다시 ret수행
pop eip
를 통하여 eip는 쉘코드를 가르키게 됩니다.

 

즉, leaveret를 두번 반복 수행하여 원하는 위치의 ret를 이용해 쉘코드를 동작 시키는 것입니다.

 

그럼 예상 페이로드는 다음과 같이 됩니다.

`python –c ‘print “A”*44 + FEBP’s address + leave’s address’` `python –c ‘print “AAAA”*4 + 쉘코드’s address + NOP슬라이드 + 쉘코드

 

입력의 편의를 위하여 매개변수를 2개 전달하도록 하겠습니다. 두번째 매개변수의 내용을 첫번째에 이어서 입력해도 되고, 버퍼를 이용해도 됩니다.

 

그럼 필요한 정보들을 획득하도록 하겠습니다.

우선 leave의 주소를 획득하도록 하겠습니다.

leave의 주소는 0x080484df입니다.

 

main+3에 중단점을 걸고 작성한 페이로드를 전달해 FEBP의 주소와, 쉘코드의 주소를 얻어내도록 하겠습니다.


FEBP의 주소는 0xbffffc1c로 잡혔고, 쉘코드의 주소는 0xbffffc30으로 하면 될듯 합니다.

 

이를 반영해 페이로드를 다시 작성하여 시도해보도록 하겠습니다.

세그펄트가 떳으므로 coredump로 디버깅 하도록 하겠습니다.

 

FEBP의 주소는 0xbffffbc9, 쉘코드의 주소는 0xbffffbe0으로 하면 될듯 합니다.

 

페이로드에 이를 반영해 다시 시도하도록 하겠습니다.

쉘이 떳네요.

 

이제 원본 파일을 대상으로 공격하도록 하겠습니다.

성공적으로 zombie_assassin의 쉘이 떳습니다.

Zombie_assassin의 패스워드는 no place to hide입니다.

+ Recent posts