-
[L.O.B] Level 15 - giantWargame/L.O.B 2022. 11. 6. 03:54반응형
Level 15 - giant를 풀어보자.
새로운 공격 기법이 나타났다!!
소스 코드를 보면 다음 Level은 assassin이고, no stack, no RTL이라는 힌트가 있다.
RTL을 앞에서 해봤으니 쓰지 마라고 하는걸까..??
아무튼 코드 하단을 보면 argv[1]의 48번째 값에 \xbf와 \x40을 사용하지 못하게 되어 있다.
그리고 buffer와 sfp를 합한 44 바이트를 0으로 초기화한다.

<assassin 소스 코드의 내용> gdb로 assassin 파일을 분석해보자.
dummy 값은 없고, 앞의 Level들처럼 특별한 내용도 없는 것 같다.
그렇다면 공격은 어떻게 해야 할까??

<assassin 파일 gdb 분석> 이번 Level에서 시도해 볼 공격은 RET Sled라고 불리는 공격 기법이다.
[RET Sled]
더보기RET Sled는 간단하게 설명하자면 RET에 RET 주소를 연속적으로 호출해 스택을 조작하는 공격 기법이다.
이것은 함수의 에필로그 과정에서의 leave와 ret를 보면 이해할 수 있다.
함수 에필로그의 과정에서 먼저 leave를 하면 ebp는 SFP를, esp는 RET를 가리키게 된다.
다음으로 ret를 하면서 pop eip와 jmp eip를 수행하게 된다.
이 과정에서 eip는 RET 주소의 명령을 실행하고, esp는 가리키고 있던 RET에서 +4 바이트만큼 이동한다.
RET Sled는 이 과정을 이용하여 RET 바로 뒤에 공격자가 실행할 코드의 주소를 넣는 공격 기법이다.
원래의 RET에 &RET를 넣어 한 번 더 실행이 되게 한다.
그렇게 하면 eip는 esp가 가리키고 있는 &RET + 4에 넣은 공격자가 원하는 주소의 명령을 실행한다.
그리고 위에서 설명했듯 이 기법은 RET 주소를 원하는 만큼 연속적으로 넣을 수 있다.
쉘을 실행시키기 위해 환경변수를 선언해 그 주소를 넣을 수도 있지만, RTL 공격을 해보도록 하자.
이번에 필요한 정보는 system 함수의 주소, /bin/sh의 주소이다.
gdb를 이용해 system 함수의 주소를 알아내고, /bin/sh를 알기 위한 소스 코드를 만들어 컴파일한다.



<system 함수의 주소, /bin/sh의 주소> 이렇게 알아낸 정보들을 이용해 페이로드를 작성해보자.
페이로드는 NOP*44 + RET의 주소 + system 함수의 주소 + NOP*4 + /bin/sh의 주소이다.
작성한 페이로드를 입력하여 프로그램을 실행하면 assassin의 권한으로 쉘이 실행된다.
my-pass를 입력하니 비밀번호가 나타났다.

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