-
[L.O.B] Level 16 - assassinWargame/L.O.B 2022. 11. 6. 08:19반응형
Level 16 - assassin을 풀어보자.
새로운 공격 기법이 나타났다!!
소스 코드를 보면 다음 Level은 zombie_assassin이고, FEBP라는 힌트가 있다.
이번 Level의 제약 조건은 앞과 비슷하지만, 마지막에 strncpy 함수를 사용해 정확한 갯수를 복사한다.

<zombie_assassin 소스 코드의 내용> gdb 분석을 통해 간단하게 dummy 값 정도를 확인한다.
dummy 값은 없고, 문제를 어떻게 풀 지를 생각해보자.

<zombie_assassin 파일 gdb 분석> 소스 코드에 FEBP라는 힌트가 있다.
이번 Level은 FEBP를 활용하여 풀어보도록 하자.
[FEBP]
더보기FEBP란 Fake-EBP를 의미한다.
문자 그대로, EBP를 조작해 원하는 코드를 실행할 수 있도록 하는 공격 기법이다.
이 공격 기법은 함수의 에필로그 과정에서 (leave-ret) gadget를 이용한다.
leave는 mov esp,ebp -> pop ebp의 과정을 거쳐 실행된다.
그 결과 ebp는 SFP를 가리키고, esp는 RET를 가리키게 된다.
위의 leave를 수행한 후, RET에 (leave-ret) gadget을 넣어 다시 leave가 수행되게 하면 어떻게 될까??
esp는 ebp가 가리키는 SFP를 가리킨 후, pop에 의해 다시 RET를 가리키게 된다.
그 후 eip가 RET에 있는 주소값의 명령어를 실행한다.
이렇게 되면 정상적으로 결과가 실행되는 것과 다름없지만, 이 과정에서 한 가지를 조작한다.
처음 leave를 수행한 후 ebp가 가리킬 SFP에 (공격자가 원하는 주소 - 4)를 넣는 것이다.
그렇게 하면 esp는 ebp가 가리키는 (공격자가 원하는 주소 - 4)를 가지게 된다.
그 후 다시 한 번 수행되는 leave의 pop에 의해 공격자가 원하는 주소의 명령어 주소를 가진다.
그 결과, eip가 esp가 가리키는 공격 주소를 수행하여 공격이 수행되는 것이다.
이번 Level의 풀이를 위해 필요한 정보는 buffer의 주소, (leave-ret) gadget이다.
먼저 간단하게 구할 수 있는 (leave-ret) gadget을 알아보자.
gdb를 실행한 후, disas main 명령어만으로도 알아낼 수 있지만 새로운 명령어를 사용해보자.
objdump -d ./zombie_assassin 명령어를 이용해 각 어셈블리가 실행되는 주소를 알 수 있다.
아래의 사진을 보면, (leave-ret) gadget은 0x080484df에 있다는 것을 알 수 있다.
(gadget은 간단히 설명하자면, 바이너리에 존재하는 push, pop, ret, leave 등의 어셈블리 코드이다.)

<leave의 주소> 다음으로, buffer의 주소를 알아보도록 하자.
strncpy 함수가 끝나는 <main+139>에 break를 걸고 python 명령어를 입력한다.
그 다음 x 명령어로 buffer의 주소를 찾으면, buffer의 주소가 0xbffffaa0인 것을 알 수 있다.

<buffer의 주소> 이제 알아낸 정보들을 바탕으로 페이로드를 작성해보자.
페이로드는 (&buffer+4) + 쉘 코드 + NOP*11 + leave + (&buffer-4)로 구성된다.
작성한 페이로드를 넣어 프로그램을 실행하면 zombie_assassin의 권한으로 쉘이 실행된다.
my-pass를 입력하니 비밀번호가 나타났다.

<나타난 비밀번호> 반응형'Wargame > L.O.B' 카테고리의 다른 글
[L.O.B] Level 18 - succubus (0) 2022.11.10 [L.O.B] Level 17 - zombie_assassin (1) 2022.11.10 [L.O.B] Level 15 - giant (0) 2022.11.06 [L.O.B] Level 14 - bugbear (0) 2022.11.05 [L.O.B] Level 13 - darkknight (0) 2022.11.04